diff --git a/maven2-archetypes/LICENSE.txt b/LICENSE.txt
similarity index 100%
rename from maven2-archetypes/LICENSE.txt
rename to LICENSE.txt
diff --git a/maven2-archetypes/NOTICE.txt b/NOTICE.txt
similarity index 100%
rename from maven2-archetypes/NOTICE.txt
rename to NOTICE.txt
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-facelets/pom.xml b/maven2-archetypes/myfaces-archetype-helloworld-facelets/pom.xml
deleted file mode 100644
index c4ca157..0000000
--- a/maven2-archetypes/myfaces-archetype-helloworld-facelets/pom.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT 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.myfaces.buildtools</groupId>
-    <artifactId>myfaces-archetype-parent</artifactId>
-    <version>1.0.2-SNAPSHOT</version>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.myfaces.buildtools</groupId>
-  <artifactId>myfaces-archetype-helloworld-facelets</artifactId>
-  <packaging>maven-plugin</packaging>
-  <name>MyFaces Facelets Archetype</name>
-  <description>Archetype to create a new webapp based on MyFaces and Facelets</description>
-
-</project>
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-portlets/pom.xml b/maven2-archetypes/myfaces-archetype-helloworld-portlets/pom.xml
deleted file mode 100644
index db5a046..0000000
--- a/maven2-archetypes/myfaces-archetype-helloworld-portlets/pom.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<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.myfaces.buildtools</groupId>
-        <artifactId>myfaces-archetype-parent</artifactId>
-        <version>1.0.2-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.apache.myfaces.buildtools</groupId>
-    <artifactId>myfaces-archetype-helloworld-portlets</artifactId>
-    <packaging>maven-plugin</packaging>
-    <name>MyFaces Portlet Archetype</name>
-    <description>Archetype to create a new portlet webapp based on myfaces</description>
-
-</project>
diff --git a/maven2-archetypes/myfaces-archetype-helloworld/pom.xml b/maven2-archetypes/myfaces-archetype-helloworld/pom.xml
deleted file mode 100644
index 5e68f54..0000000
--- a/maven2-archetypes/myfaces-archetype-helloworld/pom.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<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.myfaces.buildtools</groupId>
-        <artifactId>myfaces-archetype-parent</artifactId>
-        <version>1.0.2-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.apache.myfaces.buildtools</groupId>
-    <artifactId>myfaces-archetype-helloworld</artifactId>
-    <packaging>maven-plugin</packaging>
-    <name>MyFaces Basic Archetype</name>
-    <description>Archetype to create a new webapp based on myfaces</description>
-
-</project>
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/pom.xml b/maven2-archetypes/myfaces-archetype-jsfcomponents/pom.xml
deleted file mode 100644
index 7efdd4b..0000000
--- a/maven2-archetypes/myfaces-archetype-jsfcomponents/pom.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<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.myfaces.buildtools</groupId>
-    <artifactId>myfaces-archetype-parent</artifactId>
-    <version>1.0.2-SNAPSHOT</version>
-  </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.apache.myfaces.buildtools</groupId>
-    <artifactId>myfaces-archetype-jsfcomponents</artifactId>
-    <packaging>maven-plugin</packaging>
-    <name>JSF Component Library Archetype</name>
-    <description>Archetype to create a libary project of JSF components</description>
-</project>
diff --git a/maven2-archetypes/myfaces-archetype-trinidad/pom.xml b/maven2-archetypes/myfaces-archetype-trinidad/pom.xml
deleted file mode 100644
index 68af520..0000000
--- a/maven2-archetypes/myfaces-archetype-trinidad/pom.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT 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.myfaces.buildtools</groupId>
-    <artifactId>myfaces-archetype-parent</artifactId>
-    <version>1.0.2-SNAPSHOT</version>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.myfaces.buildtools</groupId>
-  <artifactId>myfaces-archetype-trinidad</artifactId>
-  <packaging>maven-plugin</packaging>
-  <name>MyFaces Trinidad Archetype</name>
-  <description>Archetype to create a new webapp based on Trinidad</description>
-</project>
diff --git a/maven2-archetypes/pom.xml b/maven2-archetypes/pom.xml
deleted file mode 100644
index 4356a37..0000000
--- a/maven2-archetypes/pom.xml
+++ /dev/null
@@ -1,204 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright 2006 The Apache Software Foundation.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-
-<!--
-  - The archetypes project defines a set of maven archetype plugins that can be
-  - used to create an initial directory tree of files when starting a new JSF
-  - project.
-  -
-  - This pom is used:
-  - * as the parent pom for all individual archetype modules, to define common settings
-  - * to define the common archetype website
-  - * as a convenient tool for building all the archetype projects.
-  -->
-<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>
-    <groupId>org.apache.myfaces</groupId>
-    <artifactId>myfaces</artifactId>
-    <version>5</version>
-  </parent>
-
-  <groupId>org.apache.myfaces.buildtools</groupId>
-  <artifactId>myfaces-archetype-parent</artifactId>
-  <version>1.0.2-SNAPSHOT</version>
-  <packaging>pom</packaging>
-  <name>Apache MyFaces Buildtools Maven2 Archetype Parent</name>
-  <url>http://myfaces.apache.org/build-tools/archetypes</url>
-
-  <issueManagement>
-    <system>jira</system>
-    <url>http://issues.apache.org/jira/browse/MYFACES</url>
-  </issueManagement>
-
-  <ciManagement>
-    <system>continuum</system>
-    <url>http://myfaces.zones.apache.org:8080/continuum</url>
-    <notifiers>
-      <notifier>
-        <type>mail</type>
-        <sendOnSuccess>true</sendOnSuccess>
-        <configuration>
-          <address>commits@myfaces.apache.org</address>
-        </configuration>
-      </notifier>
-    </notifiers>
-  </ciManagement>
-
-  <inceptionYear>2008</inceptionYear>
-
-  <build>
-    <resources>
-      <resource>
-        <directory>${basedir}</directory>
-        <targetPath>META-INF</targetPath>
-        <includes>
-          <include>NOTICE.txt</include>
-          <include>LICENSE.txt</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/src/main/resources</directory>
-      </resource>
-    </resources>
-
-    <pluginManagement>
-      <plugins>
-	<plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-plugin-plugin</artifactId>
-          <!-- 2.4 throws error, so temporally put on 2.3 -->
-          <version>2.3</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-jar-plugin</artifactId>
-          <version>2.2</version>
-          <configuration>
-            <archive>
-              <manifest>
-                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-              </manifest>
-            </archive>
-          </configuration>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-
-  </build>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <artifactId>maven-project-info-reports-plugin</artifactId>
-        <version>2.0.1</version>
-      </plugin>
-      <plugin>
-        <artifactId>maven-pmd-plugin</artifactId>
-        <version>2.3</version>
-        <configuration>
-          <rulesets>
-            <ruleset>/rulesets/basic.xml</ruleset>
-            <ruleset>/rulesets/unusedcode.xml</ruleset>
-          </rulesets>
-          <linkXref>true</linkXref>
-          <minimumTokens>100</minimumTokens>
-          <targetJdk>1.5</targetJdk>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/myfaces/myfaces-build-tools/trunk/maven2-archetypes/</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/myfaces/myfaces-build-tools/trunk/maven2-archetypes/</developerConnection>
-    <url>http://svn.apache.org/viewvc/myfaces/myfaces-build-tools/trunk/maven2-archetypes/</url>
-  </scm>
-
-  <modules>
-    <module>myfaces-archetype-helloworld</module>
-    <module>myfaces-archetype-helloworld-facelets</module>
-    <module>myfaces-archetype-helloworld-portlets</module>
-    <module>myfaces-archetype-trinidad</module>
-    <module>myfaces-archetype-jsfcomponents</module>
-  </modules>
-
-  <distributionManagement>
-    <snapshotRepository>
-      <uniqueVersion>false</uniqueVersion>
-      <id>apache.snapshots</id>
-      <name>Apache Maven Snapshot Repository</name>
-      <url>scpexe://people.apache.org/www/people.apache.org/repo/m2-snapshot-repository</url>
-    </snapshotRepository>
-    <site>
-      <id>apache-site</id>
-      <url>scpexe://people.apache.org/www/myfaces.apache.org/build-tools/archetypes</url>
-    </site>
-  </distributionManagement>
-
-  <profiles>
-    <profile>
-      <id>release</id>
-      <!--
-      NOTE: Execute this profile like
-            mvn clean source:jar install deploy -DaltDeploymentRepository=matzew::default::file://FOLDER -Prelease
-       -->
-      <build>
-        <plugins>
-          <plugin>
-            <artifactId>maven-gpg-plugin</artifactId>
-            <version>1.0-alpha-4</version>
-            <executions>
-              <execution>
-                <id>sign-artifacts</id>
-                <phase>verify</phase>
-                <goals>
-                  <goal>sign</goal>
-                </goals>
-              </execution>
-            </executions>
-          </plugin>
-          <plugin>
-            <artifactId>maven-javadoc-plugin</artifactId>
-            <version>2.3</version>
-            <executions>
-              <execution>
-                <id>attach-javadocs</id>
-                <goals>
-                  <goal>jar</goal>
-                </goals>
-              </execution>
-            </executions>
-          </plugin>
-          <plugin>
-            <artifactId>maven-scm-plugin</artifactId>
-            <version>1.0</version>
-            <executions>
-              <execution>
-                <phase>validate</phase>
-                <id>getting-scm.revision</id>
-                <goals>
-                  <goal>update</goal>
-                </goals>
-              </execution>
-            </executions>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-  </profiles>
-</project>
diff --git a/maven2-plugins/myfaces-builder-annotations/LICENSE.txt b/maven2-plugins/myfaces-builder-annotations/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/maven2-plugins/myfaces-builder-annotations/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/maven2-plugins/myfaces-builder-annotations/NOTICE.txt b/maven2-plugins/myfaces-builder-annotations/NOTICE.txt
deleted file mode 100644
index fa3dbd6..0000000
--- a/maven2-plugins/myfaces-builder-annotations/NOTICE.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-=========================================================================
-==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
-==  Version 2.0, in this case for the Apache MyFaces Maven Plugins     ==
-=========================================================================
-
-This product includes software developed by 
-The Apache Software Foundation (http://www.apache.org/).
-
-Portions of this software were originally based on the following:
-
- - software copyright (c) 2000-2006, Oracle Corp, <http://www.oracle.com/>.
-and are licensed to the Apache Software Foundation under the 
-"Software Grant and Corporate Contribution License Agreement"
-
-See the LICENSE.txt file for information on all licenses 
-associated with this software.
diff --git a/maven2-plugins/myfaces-builder-annotations/pom.xml b/maven2-plugins/myfaces-builder-annotations/pom.xml
deleted file mode 100644
index 02b5aa6..0000000
--- a/maven2-plugins/myfaces-builder-annotations/pom.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.
--->
-
-<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>
-    <groupId>org.apache.myfaces.buildtools</groupId>
-    <artifactId>myfaces-plugin-parent</artifactId>
-    <version>1.0.3</version>
-  </parent>
-
-  <groupId>org.apache.myfaces.buildtools</groupId>
-  <artifactId>myfaces-builder-annotations</artifactId> 
-  <version>1.0.4-SNAPSHOT</version>
-  <packaging>jar</packaging>
-  <name>Apache MyFaces Buildtools Maven2 Builder Annotations</name>
-
-  <description>
-    A set of Java 1.5 Annotation classes that can be applied to classes that are
-    intended to be JSF components, validators, etc. The maven-builder-plugin will
-    recognise these annotations and process the class appropriately.
-  </description>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>2.0.2</version>
-        <inherited>true</inherited>
-        <configuration>
-          <source>1.5</source>
-          <target>1.5</target>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <artifactId>maven-javadoc-plugin</artifactId>
-        <version>2.3</version>
-      </plugin>
-    </plugins>
-  </reporting>
-
-</project>
diff --git a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFComponent.java b/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFComponent.java
deleted file mode 100644
index b10cacb..0000000
--- a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFComponent.java
+++ /dev/null
@@ -1,349 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation identifies a class as being a JSF component, an ancestor of
- * one, or a template for one.
- * <p>
- * A JSF component is a concrete class that is a subclass of UIComponent, and
- * is registered in a faces-config.xml file. It always implements the StateHolder
- * interface, and typically has several properties that can be defined from a
- * view file (jsp, facelets or other similar technology).
- * <p>
- * The myfaces-builder-plugin uses this annotation information to generate the
- * correct faces-config.xml declarations, thus ensuring that the config declarations
- * are consistent with the code. The plugin can also optionally use this information
- * to generate JSP tag classes, and concrete UIComponent implementations.
- * <p>
- * This tag can be used in several ways:
- * <ul>
- * <li>To mark an interface as one that declares component properties.
- * <li>To mark a class that will be used as a base class by other hand-written
- * classes.
- * <li>To mark a class as an actual concrete JSF Component class which should be
- * registered as a component in faces-config etc.
- * <li>To mark a class as a base class for which a concrete component subclass should
- * be created using code generation.
- * <li>To mark a class as a "template" from which a concrete component class should
- * be created using code generation.
- * </ul>
- * Any class or interface marked with this annotation will also have its "metadata"
- * stored in the metadata file that the builder plugin creates and stores in the
- * META-INF directory of the processed project.
- * <p>
- * Note that a JSPProperty annotation (on a method) is not processed unless the class
- * is marked with this JSPComponent annotation. 
- * 
- * <h2>Annotating an Interface</h2>
- * 
- * When an interface is marked with this annotation, then classes which implement that
- * interface and are themselves marked with this annotation inherit the JSFProperty
- * settings declared on the methods in the interface.
- * <p>
- * This allows common groups of JSF properties to be defined as an interface, and each
- * JSF component class that is expected to provide those properties simply declares that
- * it implements that interface. The normal java compilation rules ensure that the concrete
- * JSF component class implements all of the methods on the interface, and the builder
- * plugin ensures that the inherited JSFProperty settings are used.
- * 
- * <h2>Annotating an Abstract Base Class</h2>
- * 
- * When an abstract class is marked with this annotation, and the name attribute is
- * not set, then this is a base class that concrete components can extend. Any
- * JSFProperty settings defined on this class are inherited by subclasses.
- * 
- * <h2>Annotating a Concrete Component Class</h2>
- * 
- * When a non-abstract class is marked with this annotation, and the name attribute
- * is defined then an entry will be created in the generated faces-config.xml file
- * marking this class as a component. 
- * <p>
- * In addition, a JSP TagHandler class will be created using code-generation and an
- * entry will be created in the generated .tld file so that the tag class can be
- * used from JSP applications.
- * 
- * <h2>Annotating a Class for Subclass Generation</h2>
- * 
- * When an abstract class is marked with this annotation, the name attribute is
- * defined, and the "clazz" attribute is defined then code-generation will be
- * used to create a concrete UIComponent class which is a subclass of this class.
- * The subclass will be registered in the generated faces-config.xml file, a
- * JSP TagHandler class will be created and registered in the .tld file, etc.
- * <p>
- * Using code-generation to create a subclass allows automatic generation of
- * the "boilerplate code" that is commonly needed for implementing component
- * property getter/setter methods and the saveState/restoreState methods.
- * <p>
- * Any abstract property getter/setter methods on the annotated class will have
- * the appropriate implementation automatically written for it in the new
- * subclass. However the parent class can override this for any particular
- * method simply by providing a concrete implementation of the method.
- * 
- * <h2>Annotating a Class as a Component Template</h2>
- * 
- * When an abstract class is marked with this annotation, the name attribute
- * is set, the clazz attribute is set, and attribute template is set to "true"
- * then code-generation will be used to create a new class that is a "copy" of
- * the source code here. As for "subclass generation", any abstract methods will
- * have an appropriate implementation generated.
- * <p>
- * This approach allows a component "template" to be written as a normal class
- * (with the usual support tools provided by IDEs etc) while allowing the
- * actual UIComponent classes to have a hierarchy that is completely under
- * the control of the annotations. In particular, this is useful for generating
- * components for a JSF specification implementation, which is very specific
- * about the inheritance hierarchy of the standard component classes.
- * <p>
- * When using this "template" approach, the annotated class itself can (and
- * probably should be) package-scoped.
- * 
- * @author Leonardo Uribe (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-@Documented
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.SOURCE)
-public @interface JSFComponent
-{
-    /**
-     * The name of the component in a page. This is the name by which the
-     * component will be referenced by the used (the name used to register
-     * JSP TagHandlers for example). For example: "mycomp".
-     * <p>
-     * When a project is generating components that live in more than one
-     * namespace, then the name can optionally include a namespace prefix,
-     * for example "x:mycomp".
-     * <p>
-     * If a class is marked with the JSFComponent annotation, but does not
-     * define the name attribute then it is a "base class" that other
-     * UIComponent classes can extend (and therefore inherit any JSFProperty
-     * definitions from the base class), but is not a component that can be
-     * instantiated.
-     * <p>
-     * This property should never be set for an interface.
-     * <p>
-     * This property should only be set for an abstract class when code
-     * generation is expected to automatically create a component based on
-     * this one (ie when clazz and perhaps template are set).
-     * <p>
-     * This attribute is not inheritable.
-     */
-    String name() default "";
-
-    /**
-     * The fully-qualified-name of a concrete component class.
-     * <p>
-     * This attribute is only relevant when "name" is also set, ie the
-     * annotation is indicating that a component is really being declared.
-     * <p>
-     * When this attribute is not defined then it is assumed that this
-     * annotated class is the actual component class.
-     * <p>
-     * When this attribute is set to something other than the name of the
-     * annotated class then the specified class is the one that the JSF
-     * component registration in faces-config.xml will refer to. And if that
-     * class does not exist in the classpath (which will normally be the
-     * case) then code-generation will be triggered to create it.
-     * <p>
-     * This attribute is not inheritable.
-     * <p>
-     * The doclet-annotation equivalent of this attribute is named "class".
-     */
-    String clazz() default "";
-    
-    /**
-     * The JSF Component Family that this component belongs to.
-     * <p>
-     * A UIComponent instance's "family" setting is used together with a "renderer-type" to
-     * find a renderer for the component (see method UIComponent.getRenderer). Each
-     * Renderer implementation is registered in a faces-config.xml file using a
-     * (component-family, renderer-type) pair.
-     * <p>
-     * If this attribute is not set then the builder plugin will look for a
-     * constant on the class with name COMPONENT_FAMILY. It is an error if a
-     * concrete component has no such setting (but the value can be inherited from an
-     * ancestor class).
-     */
-    String family() default "";
-    
-    /**
-     * The type string used to create new instances of this component.
-     * <p>
-     * Components are registered in faces-config.xml using this type value, and
-     * new instances are created via Application.createComponent(type).
-     * <p>
-     * If this attribute is not set, then the builder plugin will look for a
-     * constant on the class with name COMPONENT_TYPE. It is an error if a
-     * component has no such setting.
-     * <p>
-     * This should only be set on concrete component classes (or classes for which
-     * code generation creates a concrete component class). The attribute is
-     * not inheritable.
-     */
-    String type() default "";
-    
-    /**
-     * Define the renderer-type attribute that (together with "family") is used to
-     * look up a renderer for instances of a component.
-     * <p>
-     * See attribute "family" for more details.
-     * <p>
-     * If this attribute is not defined, the builder plugin looks for a constant
-     * on the class with name DEFAULT_RENDERER_TYPE. It is an error if a
-     * concrete component has no such setting (but the value can be inherited from an
-     * ancestor class).
-     * <p>
-     * This attribute is inheritable.
-     */
-    String defaultRendererType() default "";
-    
-    /**
-     * Indicate if the component is allowed to have other UIComponent instances
-     * as children (ie "nested within it" in a page).
-     * <p>
-     * This information can be inserted into .tld files and similar to present
-     * users with an error message if an attempt is made to define child
-     * components for a component that does not support them.
-     * <p>
-     * Code generation might also use this information to ensure that an exception
-     * is thrown if an attempt to add child components occurs at runtime.
-     * <p>
-     * Note that this is related to, but not quite the same as, the "bodyContent"
-     * attribute. That attribute prevents anything being nested inside the component
-     * in the page, while this prevents UIComponents being nested.
-     * 
-     * ?? TODO: but in JSF1.2, isn't static text a transient child??
-     * <p>
-     * This attribute is inheritable.
-     */
-    boolean canHaveChildren() default false;
-    
-    /**
-     * TODO: this is hopefully unused, and can be deleted.
-     * <p>
-     * Indicate that this component should not be defined on faces-config.xml.
-     * Anyway, if this is true or false does not have any significative impact. 
-     */
-    boolean configExcluded() default false;
-    
-    /**
-     * The name of the JSP Tag class that should be generated for this component.
-     * <p>
-     * It is an error to set this attribute if the annotated class is not a
-     * concrete JSF component.
-     * <p>
-     * TODO: ? WHat happens if a class is a concrete component but this is not
-     * set? Is a tagClass name automatically created? Or is no tag class created?
-     */
-    String tagClass() default "";
-     
-    /**
-     * Tag super class that the generated tag class extends.
-     * <p>
-     * The generated tag class for this component may need to be a subclass of
-     * different tag base classes depending upon the type of this component.
-     * For example, the JSF standard provides the following tag classes:
-     * <ul>
-     * <li>UIComponentTag (the default tag base class)
-     * <li>UIComponentBodyTag, for tags that "need to process their tag bodies".
-     * Examples from the JSF standard are h:panelGrid, h:panelGroup, h:dataTable,
-     * h:column.
-     * </ul>
-     * <p>
-     * This is optional; when not defined, the standard UIComponentTag class is
-     * used. This is appropriate for most JSF components.
-     */
-    String tagSuperclass() default "";
-    
-    /**
-     * Indicate tag handler class used for this component on facelets.
-     * 
-     */
-    String tagHandler() default "";
-    
-    /**
-     * Indicate if the element accept inner elements (JSP) or not (empty).
-     */
-    String bodyContent() default "";
-    
-    /**
-     * A Short description of the purpose of this UIComponent.
-     * <p>
-     * This information is output into the .tld and faces-config.xml files as help
-     * for users of this component, and may be displayed by IDEs and similar tools.
-     * <p>
-     * If not set, then the javadoc "summary" sentence for the class will be
-     * used. If there is no javadoc for the class then the description will be
-     * an empty string (but that will never happen, right?).
-     * <p>
-     * Note that tld or faces-config files also have a "long description" field.
-     * That value is always the complete javadoc for the component class.
-     * <p>
-     * This attribute is not inheritable.
-     */
-    String desc() default "";
-    
-    /**
-     * Serial UID to be put on class when generated.
-     * <p>
-     * This should be set only for "component template" code generation, ie
-     * where the superClass attribute is set. In this case, the generated
-     * class will have a serialVersionUID constant defined which is set to
-     * this value.
-     * <p>
-     * TODO: is this valid? Why can't the code-generation just add a
-     * serialUid value based upon what version of the template was used?
-     * Maybe because the template generates different stuff based upon
-     * what attributes are defined here?
-     */
-    String serialuid() default "";
-    
-    /**
-     * Interfaces that generated classes should implement.
-     * <p>
-     * Used only when "component template" code generation is used. When
-     * defined, then the generated class will implement the listed
-     * interfaces in addition to the interfaces that this annotated class
-     * implements.
-     */
-    String implementz() default "";
-    
-    /**
-     * Indicate if the pattern used to generate component class code is
-     * template (true) or subclass (false).
-     */
-    boolean template() default false;
-    
-    /**
-     * The name of the default client event to be return on method
-     * ClientBehaviorHolder.getDefaultEventName(). This property is
-     * JSF 2.0 specific, and the component must implement 
-     * javax.faces.component.behavior.ClientBehaviorHolder interface.  
-     * 
-     * @since 1.0.4
-     */
-    String defaultEventName() default "";
-}
diff --git a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFConverter.java b/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFConverter.java
deleted file mode 100644
index 915707b..0000000
--- a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFConverter.java
+++ /dev/null
@@ -1,83 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Used to define a jsf converter.
- * 
- * @author Leonardo Uribe (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-@Documented
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.SOURCE)
-public @interface JSFConverter
-{
-    /**
-     * Indicate the converterId which identifies this class. If not defined,
-     * it tries to get the value of the field CONVERTER_ID. 
-     */
-    String id() default "";
-
-    /**
-     * The name of the component in a page (ex: x:mycomp).
-     */
-    String name() default "";
-
-    /**
-     * The tag class used for this converter, if applies.
-     */
-    String tagClass() default "";
-    
-    /**
-     * Tag super class that inherits the tag class
-     */
-    String tagSuperclass() default "";
-
-    /**
-     * Indicate that this component should not be defined on faces-config.xml.
-     * Anyway, if this is true or false does not have any significative impact. 
-     * 
-     * @return
-     */
-    boolean configExcluded() default false;
-    
-    /**
-     * Indicate if the element accept inner elements or not.
-     */
-    String bodyContent() default "";
-    
-    /**
-     * Short description
-     */
-    String desc() default "";
-    
-    /**
-     * Serial uid that should be added on generated tag class
-     * 
-     * @since 1.0.3
-     */
-    String serialuidtag() default "";
-}
diff --git a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFExclude.java b/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFExclude.java
deleted file mode 100644
index fab0cd4..0000000
--- a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFExclude.java
+++ /dev/null
@@ -1,44 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Indicate that this code must be excluded from copying when generation using a 
- * template package scoped class is used. 
- * 
- * THIS ONLY SHOULD BE USED IN VERY SPECIAL CASES 
- * 
- * (Use abstract pattern to add custom code on component class instead).
- * 
- * @author Leonardo Uribe (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-@Documented
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.SOURCE)
-public @interface JSFExclude
-{
-
-}
diff --git a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFFacet.java b/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFFacet.java
deleted file mode 100644
index 0c5f472..0000000
--- a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFFacet.java
+++ /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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Indicate that this method is a facet method.
- * 
- * @author Leonardo Uribe (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-@Documented
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.SOURCE)
-public @interface JSFFacet
-{
-
-    /**
-     * (true|false) Define if the property is required or not. Default:false
-     */
-    boolean required() default false;
-    
-    /**
-     * Short description
-     */
-    String desc() default "";
-
-}
diff --git a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFJspAttribute.java b/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFJspAttribute.java
deleted file mode 100644
index 8d58086..0000000
--- a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFJspAttribute.java
+++ /dev/null
@@ -1,98 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 
- * Define a tag attribute. This doclet should be used inside a @JSFJspTag class, 
- * to define individual tag classes used in JSF, like f:verbatim or f:actionListener
- * 
- * @author Leonardo Uribe (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-@Documented
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.SOURCE)
-public @interface JSFJspAttribute
-{
-    /**
-     * The name of the attribute. This is the name on the tld
-     */
-    String name() default "";
-    
-    /**
-     * The class or type the component must refer on the tag class. 
-     * On 1.1 is java.lang.String always and on 1.2 is 
-     * javax.el.ValueExpression or javax.el.MethodExpression.
-     */
-    String className() default "";
-    
-    /**
-     * Long description. By default, it takes what is inside comment area.
-     */
-    String longDescription() default "";
-    
-    /**
-     * (true|false) Define if the property is required or not. Default:false
-     */
-    boolean required() default false;
-    
-    /**
-     * (true|false) This value is put on the tld when applies 
-     * and className is not javax.el.ValueExpression or 
-     * javax.el.MethodExpression.
-     */
-    boolean rtexprvalue() default false;
-    
-    /**
-     * Short description
-     */
-    String desc() default "";
-
-    /**
-     * Indicate the type that values should be
-     * cast on tld. It is supposed that the className is
-     * javax.el.ValueExpression to apply it. 
-     *
-     * @since 1.0.3
-     */
-    String deferredValueType() default "";
-
-    /**
-     * Indicate the method signature that values should be
-     * cast on tld. It is supposed that the className is
-     * javax.el.MethodExpression to apply it. 
-     *
-     * @since 1.0.3
-     */
-    String deferredMethodSignature() default "";
-    
-    /**
-     * Mark this property to not be included on the tld.
-     * 
-     * @since 1.0.3
-     */
-    boolean exclude() default false;
-}
diff --git a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFJspProperties.java b/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFJspProperties.java
deleted file mode 100644
index 3bc066f..0000000
--- a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFJspProperties.java
+++ /dev/null
@@ -1,45 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Define a set of properties used to group several definitions
- * of JSFJspProperty annotations.
- * 
- * @author Leonardo Uribe (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-@Documented
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.SOURCE)
-public @interface JSFJspProperties
-{
-
-    /**
-     * Array of JSFJspProperties to be defined.
-     */
-    JSFJspProperty [] properties();
-    
-}
diff --git a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFJspProperty.java b/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFJspProperty.java
deleted file mode 100644
index 06d87e7..0000000
--- a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFJspProperty.java
+++ /dev/null
@@ -1,102 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Defines a logical property of a component that is accessed via the
- * component's Attributes map, rather than javaBean getter/setter methods.
- * <p>
- * These logical properties are accessible from views (eg available as
- * JSP tag attributes) just like properties declared with the JSFProperty
- * annotation.
- * <p>
- * A class or interface that defines just one logical property may use this
- * annotation directly; to declare more than one logical property should
- * use the JSFJspProperties annotation to group a set of these. Classes that
- * implement interfaces with this annotation, or subclass a base class that
- * has this annotation, will inherit the declared attributes.
- * <p>
- * This annotation should only be applied to classes that also have the JSFComponent
- * and JSFValidator annotation.
- * 
- * @author Leonardo Uribe (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-@Documented
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.SOURCE)
-public @interface JSFJspProperty
-{
-
-    /**
-     * The name that identifies this attribute.
-     * <p>
-     * This String is the key used to look up the attribute in the component's
-     * Attributes map.
-     * <p>
-     * Examples: border, id, value
-     */
-    String name() default "";
-    
-    /**
-     * The type of this attribute.
-     * <p>
-     * This must be a fully-qualified class name of a java type.
-     * <p>
-     * TODO: doesn't the JSF spec also allow short-cuts for common types here?
-     */
-    String returnType() default "";
-    
-    /**
-     * Define whether this attribute is mandatory for the associated component,
-     * ie whether it is an error to create an instance of the component and
-     * not to provide a value for this attribute.
-     */
-    boolean required() default false;
-    
-    /**
-     * Define if this tag is excluded from tld.
-     * <p>
-     * This is very ugly feature, and should be used as little as possible. It
-     * allows a parent class (or interface) to declare logical properties, then
-     * a subclass to "undeclare" them. This is completely broken OO design,
-     * but is required in a few rare cases by the JSF specification. 
-     */
-    boolean tagExcluded() default false;
-    
-    /**
-     * A long description of the purpose of this attribute.
-     * <p>
-     * This is commonly shown as help in IDEs.
-     */
-    String longDesc() default "";
-    
-    /**
-     * A short description of the purpose of this attribute.
-     * <p>
-     * This is commonly shown as a "tool tip" or popup-help in IDEs.
-     */
-    String desc() default "";
-}
diff --git a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFJspTag.java b/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFJspTag.java
deleted file mode 100644
index fb77814..0000000
--- a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFJspTag.java
+++ /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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Used to define a jsf tag that does not fall in a category like converter, validator
- * or component. Examples are f:verbatim or f:actionListener
- * 
- * @author Leonardo Uribe (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-@Documented
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.SOURCE)
-public @interface JSFJspTag
-{
-    
-    /**
-     * Indicate if the element accept inner elements or not.
-     */
-    String bodyContent() default "";
-    
-    /**
-     * Short description
-     */
-    String desc() default "";
-    
-    /**
-     * The name of the component in a page (ex: x:mycomp).
-     */
-    String name() default "";
-    
-    /**
-     * Indicate tag handler class used for this component on facelets.
-     * 
-     */
-    String tagHandler() default "";
-}
diff --git a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFProperty.java b/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFProperty.java
deleted file mode 100644
index 987a646..0000000
--- a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFProperty.java
+++ /dev/null
@@ -1,160 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Define that this getter or setter method define a property.
- * 
- * @author Leonardo Uribe (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-@Documented
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.SOURCE)
-public @interface JSFProperty
-{
-
-    /**
-     * (true|false) Define if the property is required or not. Default:false
-     */
-    boolean required() default false;
-    
-    /**
-     * Indicate if the property is not saved and restored its state.
-     */
-    boolean istransient() default false;
-    
-    /**
-     * Use saveAttachedXXX and restoreAttachedXXX to save and restore state
-     */
-    boolean stateHolder() default false;
-    
-    /**
-     * Indicate that the getter and setter does not evaluate EL or ValueBinding expressions.
-     */
-    boolean literalOnly() default false;
-    
-    /**
-     * Define if this tag is excluded from tld.
-     */
-    boolean tagExcluded() default false;
-    
-    /**
-     * Indicate if it should be generated a method like
-     * getLocalXXX to retrieve the local value of the property
-     * directly (without evaluate ValueBinding or ValueExpression).
-     * 
-     * If there is no generation of component class this property
-     * has any effect.
-     * 
-     */
-    boolean localMethod() default false;
-    
-    /**
-     * Define the scope to be used when generating the method getLocalXXX.
-     * 
-     * The default to be applied is "protected".
-     * 
-     */
-    String localMethodScope() default "";
-    
-    /**
-     * Indicate if it should be generated a method like
-     * isSetXXX, used when it is necessary to check if a boolean type
-     * property was set programatically (using setXXX method) or not. 
-     * 
-     * If there is no generation of component class this property
-     * has any effect.
-     */
-    boolean setMethod() default false;
-    
-    /**
-     * Define the scope to be used when generating the method isSetXXX.
-     * 
-     * The default to be applied is "protected".
-     * 
-     */
-    String setMethodScope() default "";
-    
-    /**
-     * The name used in jsp pages to make reference to this
-     * property (used on tld).
-     */
-    String jspName() default "";
-    
-    /**
-     * (true|false) This value is put on the tld when applies.
-     */
-    boolean rtexprvalue() default false;
-    
-    /**
-     * Short description
-     */
-    String desc() default "";
-    
-    /**
-     * Indicate if this property is inherited from a parent tag class or not.
-     * 
-     * @return
-     */
-    boolean inheritTag() default false;
-    
-    /**
-     * The full name of the return type for MethodBinding or MethodExpression it uses
-     */
-    String returnSignature() default "";
-
-    /**
-     * CSV full names of the types that are params for methods using this MethodBinding or MethodExpression param
-     */
-    String methodSignature() default "";
-    
-    /**
-     * The default value to set if this property is generated.
-     */
-    String defaultValue() default "";
-
-    /**
-     * Indicate the type that values should be cast on tld. 
-     * This param only applies on jsf 1.2 (it is supposed that 
-     * the className is javax.el.ValueExpression to apply it),
-     * because in jsf 1.1, values on tag class are considered 
-     * to be String. 
-     *
-     * @since 1.0.3
-     */
-    String deferredValueType() default "";
-    
-    /**
-     * Indicate if this property is a client event that should
-     * be returned by ClientBehaviorHolder.getEventNames(). This
-     * property is by default "", it is JSF 2.0 specific, and 
-     * the component holding it must implement 
-     * javax.faces.component.behavior.ClientBehaviorHolder interface.
-     * 
-     * @since 1.0.4
-     */
-    String clientEvent() default "";
-}
diff --git a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFRenderKit.java b/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFRenderKit.java
deleted file mode 100644
index 642bc3f..0000000
--- a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFRenderKit.java
+++ /dev/null
@@ -1,42 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * The renderKitId that identifies this RenderKit. This is registered on faces-config.xml.
- * 
- * @author Leonardo Uribe (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-@Documented
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.SOURCE)
-public @interface JSFRenderKit
-{
-    /**
-     * The renderKitId related to this class 
-     */
-    String renderKitId() default "";
-}
diff --git a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFRenderer.java b/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFRenderer.java
deleted file mode 100644
index e2eaceb..0000000
--- a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFRenderer.java
+++ /dev/null
@@ -1,58 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Indicate that this class is a Renderer. This is registered on faces-config.xml.
- * 
- * @author Leonardo Uribe (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-@Documented
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.SOURCE)
-public @interface JSFRenderer
-{
-    /**
-     * The renderKitId that belongs this renderer. If no custom renderkit defined you should use HTML_BASIC.
-     */
-    String renderKitId() default "";
-    
-    /**
-     * The component family that this renderer should be applied.
-     */
-    String family() default "";
-    
-    /**
-     * The renderer type that is applied this renderer.
-     */
-    String type() default "";
-    
-    /**
-     * Short description
-     */
-    String desc() default "";
-
-}
diff --git a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFRenderers.java b/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFRenderers.java
deleted file mode 100644
index 4cf067f..0000000
--- a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFRenderers.java
+++ /dev/null
@@ -1,45 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Define a set of renderers used to group several definitions
- * of JSFRenderer annotations.
- * 
- * @author Leonardo Uribe (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-@Documented
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.SOURCE)
-public @interface JSFRenderers
-{
-
-    /**
-     * Array of JSFRenderer to be defined.
-     */
-    JSFRenderer [] renderers();
-    
-}
diff --git a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFValidator.java b/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFValidator.java
deleted file mode 100644
index 60d43ed..0000000
--- a/maven2-plugins/myfaces-builder-annotations/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/annotation/JSFValidator.java
+++ /dev/null
@@ -1,107 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Used to define a jsf validator.
- * 
- * @author Leonardo Uribe (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-@Documented
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.SOURCE)
-public @interface JSFValidator
-{
-    
-    /**
-     * Indicate the validatorId which identifies this class. If not defined, it
-     * tries to get the value of the field VALIDATOR_ID.
-     */
-    String id() default "";
-    
-    /**
-     * The name of the component in a page (ex: x:mycomp).
-     */
-    String name() default "";
-
-    /**
-     * The tag class used for this validator, if applies.
-     */
-    String tagClass() default "";
-    
-    /**
-     * Tag super class that inherits the tag class
-     */
-    String tagSuperclass() default "";
-
-    /**
-     * Indicate that this component should not be defined on faces-config.xml.
-     * Anyway, if this is true or false does not have any significative impact. 
-     * 
-     * @return
-     */
-    boolean configExcluded() default false;
-        
-    /**
-     * Indicate if the element accept inner elements or not.
-     */
-    String bodyContent() default "";
-    
-    /**
-     * Short description
-     */
-    String desc() default "";
-    
-    /**
-     * Serial uid that should be added on generated tag class
-     * 
-     * @since 1.0.3
-     */
-    String serialuidtag() default "";
-    
-    /**
-     * The fully-qualified-name of a concrete validator class.
-     * <p>
-     * This attribute is only relevant when "name" is also set, ie the
-     * annotation is indicating that a validator is really being declared.
-     * <p>
-     * When this attribute is not defined then it is assumed that this
-     * annotated class is the actual validator class.
-     * <p>
-     * When this attribute is set to something other than the name of the
-     * annotated class then the specified class is the one that the JSF
-     * validator registration in faces-config.xml will refer to. And if that
-     * class does not exist in the classpath (which will normally be the
-     * case) then code-generation will be triggered to create it.
-     * <p>
-     * This attribute is not inheritable.
-     * <p>
-     * The doclet-annotation equivalent of this attribute is named "class".
-     * 
-     * @since 1.0.3
-     */
-    String clazz() default "";
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/LICENSE.txt b/maven2-plugins/myfaces-builder-plugin/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/maven2-plugins/myfaces-builder-plugin/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/maven2-plugins/myfaces-builder-plugin/NOTICE.txt b/maven2-plugins/myfaces-builder-plugin/NOTICE.txt
deleted file mode 100644
index fa3dbd6..0000000
--- a/maven2-plugins/myfaces-builder-plugin/NOTICE.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-=========================================================================
-==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
-==  Version 2.0, in this case for the Apache MyFaces Maven Plugins     ==
-=========================================================================
-
-This product includes software developed by 
-The Apache Software Foundation (http://www.apache.org/).
-
-Portions of this software were originally based on the following:
-
- - software copyright (c) 2000-2006, Oracle Corp, <http://www.oracle.com/>.
-and are licensed to the Apache Software Foundation under the 
-"Software Grant and Corporate Contribution License Agreement"
-
-See the LICENSE.txt file for information on all licenses 
-associated with this software.
diff --git a/maven2-plugins/myfaces-builder-plugin/pom.xml b/maven2-plugins/myfaces-builder-plugin/pom.xml
deleted file mode 100644
index 28d55cd..0000000
--- a/maven2-plugins/myfaces-builder-plugin/pom.xml
+++ /dev/null
@@ -1,198 +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.
-	   
--->
-<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>
-    <groupId>org.apache.myfaces.buildtools</groupId>
-    <artifactId>myfaces-plugin-parent</artifactId>
-    <version>1.0.3</version>
-  </parent>
-
-  <groupId>org.apache.myfaces.buildtools</groupId>
-  <artifactId>myfaces-builder-plugin</artifactId> 
-  <version>1.0.4-SNAPSHOT</version>
-  <packaging>maven-plugin</packaging>
-  <name>Apache MyFaces Buildtools Maven2 Builder Plugin</name>
-  <description>
-    A maven plugin that uses annotations (java15 or doclet style) to generate the necessary JSF configuration
-    files (.tld, faces-config.xml, etc) and optionally Tag, Validator and Component classes.
-  </description>
-
-  <build>
-    <plugins>
-      <!-- required for plexus, but we are not using this right now
-      <plugin>
-        <artifactId>maven-plugin-plugin</artifactId>
-        <configuration>
-          <goalPrefix>myfaces-builder</goalPrefix>
-        </configuration>
-      </plugin>
-       -->
-      <plugin>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>2.0.2</version>
-        <inherited>true</inherited>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-        </configuration>
-      </plugin>
-      <plugin>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <version>2.4.2</version>
-      </plugin>
-    </plugins>
-  </build>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-plugin-plugin</artifactId>
-        <version>2.2</version>
-      </plugin>
-      <plugin>
-        <artifactId>maven-javadoc-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </reporting>
-  
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-      <version>2.0</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId>
-      <version>2.0</version>
-    </dependency>
-    
-    <dependency>    
-      <groupId>org.apache.maven.plugins</groupId>
-      <artifactId>maven-dependency-plugin</artifactId>
-      <version>2.0</version>
-    </dependency>   
-
-    <dependency>
-      <groupId>com.thoughtworks.qdox</groupId>
-      <artifactId>qdox</artifactId>
-      <version>1.9.1</version>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-digester</groupId>
-      <artifactId>commons-digester</artifactId>
-      <version>1.8</version>
-    </dependency>
-
-    <!--
-    <dependency>
-    	<groupId>xml-apis</groupId>
-    	<artifactId>xml-apis</artifactId>
-    	<version>1.0.b2</version>
-    	<scope>runtime</scope>
-    </dependency>
-    -->
-
-    <dependency>
-      <groupId>saxon</groupId>
-      <artifactId>saxon</artifactId>
-      <version>6.5.3</version>
-      <scope>runtime</scope>
-    </dependency>
-    
-    <!--
-    <dependency>
-      <groupId>xerces</groupId>
-      <artifactId>xercesImpl</artifactId>
-      <version>2.6.2</version>
-      <scope>runtime</scope>
-    </dependency>
-    -->
-
-    <dependency>
-    	<groupId>stax</groupId>
-    	<artifactId>stax-api</artifactId>
-    	<version>1.0.1</version>
-    	<!-- <scope>compile</scope>  -->
-    </dependency>
-
-    <dependency>
-    	<groupId>stax</groupId>
-    	<artifactId>stax</artifactId>
-    	<version>1.2.0</version>
-    	<!-- <scope>runtime</scope>  -->
-    </dependency>
-
-    <dependency>
-      <groupId>velocity</groupId>
-      <artifactId>velocity</artifactId>
-      <version>1.5</version>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-collections</groupId>
-      <artifactId>commons-collections</artifactId>
-      <version>3.1</version>
-    </dependency>
-    <!--     
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-velocity</artifactId>
-      <version>1.1.7</version>
-    </dependency>
-     -->
-    
-    <!-- Reporting required API-->   
-    <dependency>
-      <groupId>org.apache.maven.reporting</groupId>
-      <artifactId>maven-reporting-impl</artifactId>
-      <version>2.0</version>
-    </dependency>
-        
-    <dependency>
-      <groupId>org.apache.maven.doxia</groupId>
-      <artifactId>doxia-core</artifactId>
-      <version>1.0-alpha-7</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.maven.doxia</groupId>
-      <artifactId>doxia-site-renderer</artifactId>
-      <version>1.0-alpha-7</version>
-    </dependency>
-    <!-- End Reporting required API -->
-
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <version>1.2.13</version>
-    </dependency>
-  </dependencies>
-
-</project>
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/BuildMetaDataMojo.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/BuildMetaDataMojo.java
deleted file mode 100644
index 9903a8b..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/BuildMetaDataMojo.java
+++ /dev/null
@@ -1,486 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.maven.model.Resource;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ComponentMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.qdox.QdoxModelBuilder;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.utils.BuildException;
-import org.codehaus.plexus.util.StringUtils;
-
-/**
- * Maven goal which runs one or more ModelBuilder objects to gather metadata
- * about JSF artifacts into a Model object, then save that model object as an
- * xml file for use by other goals of this plugin.
- * <p>
- * By default, the generated file is named "META-INF/myfaces-metadata.xml".
- * This file will be included in the final artifact for this project. Having
- * that metadata file embedded in the generated jarfile is useful for two
- * purposes:
- * <ul>
- * <li>It is needed if other projects then use the myfaces-builder-plugin to
- * create subclasses of the jsf classes in this project.</li>
- * <li>It is good documentation (more precise than the tld and faces-config.xml
- * files).</li>
- * </ul>
- * </p>
- * <p>
- * Note that the generated file contains all the metadata needed by this
- * project, including a copy of all the metadata from other projects that
- * this one depends on. All other goals of this plugin can execute with
- * just the generated metadata as input, without needing to load other
- * projects. Each entry in the metadata is labelled with a "modelId"
- * property that indicates where it originally came from.
- * </p>
- * 
- * @requiresDependencyResolution compile
- * @goal build-metadata
- * @phase generate-sources
- */
-public class BuildMetaDataMojo extends AbstractMojo
-{
-    /**
-     * Injected Maven project object.
-     * 
-     * @parameter expression="${project}"
-     * @readonly
-     */
-    private MavenProject project;
-
-    /**
-     * Build directory for all generated stuff.
-     * <p>
-     * This mojo registers the specified directory with Maven as a resource dir. The
-     * maven-resources-plugin will then read the files from this dir and copy them
-     * into the "central" target directory from which the jarfile is built. 
-     * </p>
-     * 
-     * @parameter expression="${project.build.directory}/myfaces-builder-plugin/main/resources"
-     */
-    private File targetDirectory;
-
-    /**
-     * Name of the metadata file to generate, relative to targetDirectory.
-     * 
-     * @parameter
-     */
-    private String outputFile = "META-INF/myfaces-metadata.xml";
-
-    /**
-     * The modelId to associate with all model items discovered in the
-     * source directories of this project.
-     * <p>
-     * This value <i>must</i> be unique for each project. If not specified,
-     * then it defaults to the artifactId of the current maven project.
-     * </p>
-     * <p>
-     * In later phases, goals are passed the complete metadata model which
-     * mixes items discovered here with items imported from metadata in 
-     * other projects. The modelId is used to figure out which of the
-     * items should be processed (ie which ones are associated with this
-     * project) and which should be ignored.
-     * </p>
-     *
-     * @parameter expression="${project.artifactId}"
-     */
-    private String modelId;
-    
-    /**
-     * Replace the package prefix.
-     * <p>
-     * This allows a project that inherits metadata from some other project to force
-     * copies of the Tag classes to be created in a namespace of its own choosing.
-     * </p>
-     * <p>
-     * This is used in particular to create copies of the Tag classes in myfaces-impl
-     * within other projects so that they can be used as base classes for other tags
-     * within that project. The original tag present in the myfaces-impl.jar cannot
-     * be used as a base because that would prevent the derived project from running
-     * with other JSF implementations.
-     * </p>
-     * <p>
-     * The child project first defines this (and replacePackagePrefixTagTo); as the
-     * inherited metadata is merged the tagClass attribute is modified. Then during
-     * the tag class generation goal, the modelId of the inherited project is included
-     * in the list of modelIds to process. That causes the tag classes to be generated
-     * again - but this time in a different package.
-     * </p>
-     * 
-     * @parameter
-     */
-    private String replacePackagePrefixTagFrom;
-
-    /**
-     * Replace the package prefix
-     * <p>
-     * See replacePackagePrefixTagTo.
-     * </p>
-     * 
-     * @parameter
-     */
-    private String replacePackagePrefixTagTo;
-    
-    /**
-     * Specify the order in which models are to be merged (not usually needed).
-     * <p>
-     * When two different models define exactly the same item (ie the "class" attribute
-     * for two items is the same) then the one from the model that is merged first is
-     * used, and the later one is ignored.
-     * </p>
-     * <p>
-     * This property allows the order of merging to be controlled; models are merged in
-     * the order specified in this list. Any models whose ids are not in this list are
-     * then merged in an undefined order at the end.
-     * </p>
-     * <p>
-     * Setting this property is not normally necessary; typically models inherited from
-     * dependencies define different model items (ie have no overlap). However consider
-     * the situation where project A defines a model, project B extends A, then project C
-     * extends B. In this case, both A and B are in the dependencies, but the metadata in
-     * project B contains a complete copy of all the data from A. However B's metadata is
-     * from <i>the version of A that it was compiled against</i> which might not be the
-     * version of A that is in the dependencies. For safety in this case, it is better to
-     * ensure that project B's metadata is loaded first; this can possibly hide any new
-     * features (or bugfixes) from the new release of A, but also ensures that classes
-     * in C which extend classes in B do not declare features that B does not support.
-     * </p>
-     * <p>
-     * This property is only needed in rare situations; normally it can be omitted.
-     * </p>
-     * 
-     * @parameter
-     */
-    private List orderModelIds;
-    
-    /**
-     * An optional list of models to import from dependency jars.
-     * <p>
-     * The default behaviour is to scan all jar dependencies for metadata files, and
-     * merge all the data into the model for this project. If this property is set,
-     * then metadata found in dependencies is only merged if the modelId matches one
-     * in this list.
-     * </p>
-     * <p>
-     * Note that by default, a project's modelId is the same as the artifactId.
-     * </p>
-     * 
-     * @parameter
-     */
-    private List dependencyModelIds;
-    
-    /**
-     * The name of a metadata file to merge into the model for the current project.
-     * <p>
-     * This file is always loaded first, before any metadata from dependencies is
-     * loaded, and before scanning of the source directories for the current
-     * project is done.
-     * </p>
-     * <p>
-     * The specified filename is relative to the current working directory.
-     * </p>
-     * <p>
-     * Normally, this option is not used and any models that this project extends
-     * are simply automatically detected via scanning of the maven dependencies and
-     * loaded from the dependency jarfile. However there are a couple of situations
-     * where it is useful to specify an explicit metadata file to load instead.  
-     * </p>
-     * <p> 
-     * One example is when a project extends components in a project which was not
-     * built with the myfaces-builder-plugin (or where myfaces-builder-plugin
-     * support is only in a not-yet-released version). In this case, a metadata file
-     * can be created by hand (or generated from the unreleased trunk version) and
-     * explicitly loaded via this property.
-     * </p>
-     * <p>
-     * A second example is when it is necessary to add some custom model definitions to
-     * the model to be built, eg to override buggy or missing metadata in a project
-     * that this project extends. Of course this is hopefully not needed; it would be
-     * better to get a bugfix release of the parent project out instead!
-     * </p>
-     * 
-     * @parameter
-     */
-    private File inputFile;
-    
-    /**
-     * A comma separated list of file patterns to include when building the
-     * model.  i.e.  **\/*.java
-     * 
-     * @parameter
-     */
-    private String includes;
-    
-    /**
-     *  A comma separated list of file patterns to exclude when building the
-     *  model.  i.e.  **\/*.java
-     * @parameter
-     */
-    private String excludes;
-    
-    /**
-     * Create a metadata file containing information imported from other projects
-     * plus data extracted from annotated classes in this project.
-     */
-    public void execute() throws MojoExecutionException
-    {
-        try
-        {
-            // Tell Maven to add this directory to its "resources" path. 
-            // The maven-resources-plugin will then copy all the files
-            // from this directory to its own target directory, which is
-            // where the final jar artifact is built from.
-            addResourceRoot(project, targetDirectory.getCanonicalPath());
-        }
-        catch(IOException e)
-        {
-            throw new MojoExecutionException("Error during generation", e);
-        }
-        
-        List models = IOUtils.getModelsFromArtifacts(project); 
-        models = sortModels(models);
-
-        Model model = new Model();
-
-        if (inputFile != null)
-        {
-            // An explicitly-specified input model takes precedence
-            Model fileModel = IOUtils.loadModel(inputFile);
-            model.merge(fileModel);
-        }
-        
-        
-        for (Iterator it = models.iterator(); it.hasNext();)
-        {
-            Model artifactModel = (Model) it.next();
-            
-            if ((dependencyModelIds == null) || dependencyModelIds.contains(artifactModel.getModelId()))
-            {
-                model.merge(artifactModel);
-            }
-        }
-
-        buildModel(model, project);
-        resolveReplacePackage(model);
-        
-        IOUtils.saveModel(model, new File(targetDirectory, outputFile));
-        
-        validateComponents(model);
-    }
-    
-    /**
-     * Order the models as specified by the modelIdOrder property.
-     * <p>
-     * Tomahawk sandbox depends from myfaces-api and tomahawk core, so
-     * the myfaces-metadata.xml of tomahawk core must be merged first
-     * and then myfaces-api.
-     * <p>
-     * In some cases, the same metadata can be imported multiple times.
-     * For example, Project A has metadata. Project B extends A, and
-     * Project C extends B. 
-     * 
-     * @param models
-     * @return
-     */
-    private List sortModels(List models)
-    {
-        if (orderModelIds == null)
-        {
-            //No changes
-            return models;
-        }
-        
-        Map modelsMap = new HashMap();
-        List modelsSorted = new ArrayList();
-
-        // First, put all models into a map keyed by modelId.
-        for (Iterator it = models.iterator(); it.hasNext();)
-        {
-            Model artifactModel = (Model) it.next();
-            modelsMap.put(artifactModel.getModelId(), artifactModel);
-        }
-
-        // now pull them out of the map in the order specified by orderModelIds.
-        for (Iterator it = orderModelIds.iterator(); it.hasNext();)
-        {
-            String modelId = (String) it.next();
-            
-            Model artifactModel = (Model) modelsMap.get(modelId);
-            if (artifactModel != null)
-            {
-                modelsMap.remove(modelId);
-                modelsSorted.add(artifactModel);
-            }
-        }
-
-        // and any of the ones that remain in the map (ie had no order specified)
-        // now get added to the end of the list.
-        modelsSorted.addAll(modelsMap.values());
-        
-        return modelsSorted;
-    }
-    
-    private void resolveReplacePackage(Model model)
-    {
-        if (replacePackagePrefixTagFrom == null ||
-                replacePackagePrefixTagTo == null)
-        {
-            return;
-        }
-        
-        List components = model.getComponents();
-        for (Iterator i = components.iterator(); i.hasNext();)
-        {
-            ComponentMeta comp = (ComponentMeta) i.next();
-            
-            if (comp.getTagClass() == null)
-            {
-                continue;
-            }
-            if (comp.getTagClass().startsWith(replacePackagePrefixTagFrom))
-            {
-                comp.setTagClass(StringUtils.replaceOnce(
-                        comp.getTagClass(), replacePackagePrefixTagFrom, replacePackagePrefixTagTo));
-            }
-        }
-    }
-    
-
-    /**
-     * Execute ModelBuilder classes to create the Model data-structure.
-     */
-    private Model buildModel(Model model, MavenProject project)
-            throws MojoExecutionException
-    {
-        try
-        {
-            QdoxModelBuilder builder = new QdoxModelBuilder();
-            model.setModelId(modelId);
-            builder.buildModel(model, project,includes,excludes);            
-            return model;
-        }
-        catch (BuildException e)
-        {
-            throw new MojoExecutionException("Unable to build metadata", e);
-        }
-    }
-    
-    protected void addResourceRoot(MavenProject project, String resourceRoot)
-    {
-        List resources = project.getBuild().getResources();
-        Resource resource = new Resource();
-        resource.setDirectory(resourceRoot);
-        resources.add(resource);
-    }
-    
-    /**
-     * Check that each component is valid (has all mandatory properties etc).
-     * <p>
-     * Most sanity checks are best done after the myfaces-metadata.xml file
-     * is created, so that if an error occurs the file is available for the
-     * user to inspect. In particular, problems due to missing properties
-     * which are permitted to be inherited can be tricky to track down if
-     * the metadata file is not available.
-     * <p>
-     * TODO: make this gather up all the errors, then report them at once
-     * rather than stopping on the first error found.
-     */
-    private void validateComponents(Model model) throws MojoExecutionException
-    {
-        for(Iterator i = model.components(); i.hasNext(); )
-        {
-            ComponentMeta component = (ComponentMeta) i.next();
-            validateComponent(model, component);
-        }
-    }
-    
-    private void validateComponent(Model model, ComponentMeta component)
-    throws MojoExecutionException
-    {
-        if (component.getName() != null)
-        {
-            if (component.getDescription() == null)
-            {
-                throw new MojoExecutionException(
-                        "Missing mandatory property on component " + component.getClassName()
-                        + " [sourceClass=" + component.getSourceClassName() + "]: description");
-            }
-
-            if (component.getType() == null)
-            {
-                throw new MojoExecutionException(
-                        "Missing mandatory property on component " + component.getClassName()
-                        + " [sourceClass=" + component.getSourceClassName() + "]: type");
-            }
-            
-            // this is a concrete component, so it must have a family property
-            validateComponentFamily(model, component);
-        }
-    }
-    
-    private void validateComponentFamily(Model model, ComponentMeta component)
-    throws MojoExecutionException
-    {
-        // TODO: clean this code up, it is pretty ugly
-        boolean familyDefined = false;
-        ComponentMeta curr = component;
-        while ((curr != null) && !familyDefined)
-        {
-            if (curr.getFamily() != null)
-            {
-                familyDefined = true;
-            }
-            else
-            {
-                String parentName = curr.getParentClassName();
-                if (parentName == null)
-                {
-                    curr = null;
-                }
-                else
-                {
-                    curr = model.findComponentByClassName(parentName);
-                    if (curr == null)
-                    {
-                        throw new MojoExecutionException(
-                                "Parent class not found for component " + component.getClassName()
-                                + " [sourceClass=" + component.getSourceClassName() + "]");
-                    }
-                }
-            }
-        }
-        if (!familyDefined)
-        {
-            throw new MojoExecutionException(
-                "Missing mandatory property on component " + component.getClassName()
-                + " [sourceClass=" + component.getSourceClassName() + "]: family");
-        }
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/Flattener.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/Flattener.java
deleted file mode 100644
index 972894a..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/Flattener.java
+++ /dev/null
@@ -1,290 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.AttributeMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ComponentMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ConverterMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.PropertyMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.TagMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ValidatorMeta;
-
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.MethodSignatureMeta;
-
-/**
- */
-public class Flattener
-{
-    private final Log log = LogFactory.getLog(Flattener.class);
-
-    private Model model;
-    private Set flattened = new HashSet();
-
-    public Flattener(Model model)
-    {
-        this.model = model;
-    }
-
-    /**
-     * Flatten the specified model.
-     * <p>
-     * In the flattened representation, each model object directly contains the
-     * data that it inherits from its parents, so that the getter methods return
-     * all available metadata, not just the data that was defined directly on
-     * that item.
-     */
-    public void flatten()
-    {
-        flattenComponentProperties();
-        flattenValidatorProperties();
-        flattenConverterProperties();
-        flattenTagAttributes();
-    }
-
-    private void flattenComponentProperties()
-    {
-        List components = model.getComponents();
-        for (Iterator i = components.iterator(); i.hasNext();)
-        {
-            ComponentMeta comp = (ComponentMeta) i.next();
-            flattenComponent(comp);
-        }
-    }
-
-    private void flattenComponent(ComponentMeta component)
-    {
-        if (flattened.contains(component))
-        {
-            // already done
-            return;
-        }
-        String parentClassName = component.getParentClassName();
-        if (parentClassName != null)
-        {
-            ComponentMeta parent = model
-                    .findComponentByClassName(parentClassName);
-            if (parent != null)
-            {
-                flattenComponent(parent);
-                component.merge(parent);
-            }
-            else
-            {
-                //How to manage a component that its
-                //parent class is not a real component?
-                //Use UIComponent instead and log a warn
-                //so if needed we can fix this.
-                log.warn("Component:"+component.getClassName()+
-                        " without a parent defined as component, using " +
-                        "UIComponent");
-                parent = model
-                    .findComponentByClassName("javax.faces.component.UIComponent");
-                flattenComponent(parent);
-                component.merge(parent);                
-            }
-        }
-
-        List interfaceClassNames = component.getInterfaceClassNames();
-        for (Iterator i = interfaceClassNames.iterator(); i.hasNext();)
-        {
-            String ifaceClassName = (String) i.next();
-            ComponentMeta iface = model
-                    .findComponentByClassName(ifaceClassName);
-            flattenComponent(iface);
-            component.merge(iface);
-        }
-
-        flattened.add(component);
-    }
-    
-    private void flattenValidatorProperties()
-    {
-        List validator = model.getValidators();
-        for (Iterator i = validator.iterator(); i.hasNext();)
-        {
-            ValidatorMeta val = (ValidatorMeta) i.next();
-            flattenValidator(val);
-        }
-    }
-    
-    private void flattenValidator(ValidatorMeta validator)
-    {
-        if (flattened.contains(validator))
-        {
-            // already done
-            return;
-        }
-        String parentClassName = validator.getParentClassName();
-        if (parentClassName != null)
-        {
-            ValidatorMeta parent = model
-                    .findValidatorByClassName(parentClassName);
-            if (parent != null)
-            {
-                flattenValidator(parent);
-                validator.merge(parent);
-            }
-            else
-            {
-                //How to manage a validator that its
-                //parent class is not a real validator?
-                //Ans: no problem, do nothing.
-            }
-        }
-
-        flattened.add(validator);
-    }
-
-    private void flattenConverterProperties()
-    {
-        List converter = model.getConverters();
-        for (Iterator i = converter.iterator(); i.hasNext();)
-        {
-            ConverterMeta val = (ConverterMeta) i.next();
-            flattenConverter(val);
-        }
-    }
-    
-    private void flattenConverter(ConverterMeta converter)
-    {
-        if (flattened.contains(converter))
-        {
-            // already done
-            return;
-        }
-        String parentClassName = converter.getParentClassName();
-        if (parentClassName != null)
-        {
-            ConverterMeta parent = model
-                    .findConverterByClassName(parentClassName);
-            if (parent != null)
-            {
-                flattenConverter(parent);
-                converter.merge(parent);
-            }
-            else
-            {
-                //How to manage a validator that its
-                //parent class is not a real validator?
-                //Ans: no problem, do nothing.
-            }
-        }
-
-        flattened.add(converter);
-    }
-    
-    private void flattenTagAttributes()
-    {
-        List tags = model.getTags();
-        for (Iterator i = tags.iterator(); i.hasNext();)
-        {
-            TagMeta val = (TagMeta) i.next();
-            flattenTag(val);
-        }
-    }
-    
-    /**
-     * This method allows component tag classes to be
-     * used with tags, so it is possible to inherit attribute
-     * for component tags. But tags cannot inherit
-     * attributes from other tags. 
-     *  
-     */
-    private void flattenTag(TagMeta tag)
-    {
-        if (flattened.contains(tag))
-        {
-            // already done
-            return;
-        }
-        
-        if (tag.getSourceClassParentClassName() == null)
-        {
-            //No need to scan
-            return;
-        }
-        ComponentMeta component = model.findComponentByTagClassName(
-                tag.getSourceClassParentClassName());
-        
-        if (null != component)
-        {
-            Collection propertyList = component.getPropertyList();
-            for (Iterator it = propertyList.iterator(); it.hasNext();)
-            {
-                PropertyMeta property = (PropertyMeta) it.next();
-                
-                //Just add all non tag excluded properties. 
-                if (!property.isTagExcluded().booleanValue())
-                {
-                    AttributeMeta attribute = new AttributeMeta();
-                    if (property.isMethodExpression())
-                    {
-                        attribute.setClassName("javax.el.MethodExpression");
-                        MethodSignatureMeta sig = property.getMethodBindingSignature();
-                        attribute.setDeferredMethodSignature(
-                                sig.getReturnType()+" myMethod("+sig.getParameterTypesAsString()+")");
-                    }
-                    else if (null == property.isRtexprvalue() || !property.isRtexprvalue().booleanValue())
-                    {
-                        attribute.setDeferredValueType(property.getClassName());
-                        attribute.setClassName("javax.el.ValueExpression");
-                    }
-                    else
-                    {
-                        //rtexprvalue = true, set className as expected
-                        attribute.setClassName(property.getClassName());
-                    }
-                    attribute.setRtexprvalue(property.isRtexprvalue());
-                    
-                    attribute.setDescription(property.getDescription());
-                    attribute.setLongDescription(property.getLongDescription());
-                    attribute.setName(property.getJspName());
-                    attribute.setRequired(property.isRequired());
-
-                    //just add attribute to tag
-                    AttributeMeta attributeInTag = tag.getAttribute(attribute.getName());
-                    
-                    if (attributeInTag != null)
-                    {
-                        //attributeInTag takes precedence, so 
-                        //we have to merge and copy
-                        attribute.merge(attributeInTag);
-                        attributeInTag.copy(attribute);
-                    }
-                    else
-                    {
-                        //Add it to tag
-                        tag.addAttribute(attribute);
-                    }
-                }
-            }
-        }
-        
-        flattened.add(tag);
-    }
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/IOUtils.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/IOUtils.java
deleted file mode 100644
index 9c6e31c..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/IOUtils.java
+++ /dev/null
@@ -1,383 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.apache.commons.digester.Digester;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.io.XmlWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-import org.xml.sax.SAXException;
-
-/**
- * Utilities to write a Model as xml, and read a Model in from xml.
- */
-public class IOUtils
-{
-    
-    private final static String MYFACES_METADATA = "META-INF/myfaces-metadata.xml";
-    
-    /**
-     * Write the contents of the model to an xml file.
-     */
-    public static void saveModel(Model model, File outfile)
-            throws MojoExecutionException
-    {
-        FileWriter writer = null;
-
-        try
-        {
-            outfile.getParentFile().mkdirs();
-
-            writer = new FileWriter(outfile);
-            writeModel(model, writer);
-        }
-        catch (IOException e)
-        {
-            throw new MojoExecutionException("Unable to save data", e);
-        }
-        finally
-        {
-            try
-            {
-                if (writer != null)
-                {
-                    writer.close();
-                }
-            }
-            catch (IOException e)
-            {
-                // ignore
-            }
-        }
-    }
-
-    /**
-     * Write the contents of the model to a provided Writer object.
-     */
-    public static void writeModel(Model model, Writer writer)
-            throws MojoExecutionException
-    {
-        try
-        {
-            writer.write("<?xml version='1.0' ?>\n");
-            PrintWriter pw = new PrintWriter(writer);
-            XmlWriter xmlWriter = new XmlWriter(pw);
-            Model.writeXml(xmlWriter, model);
-        }
-        catch (IOException e)
-        {
-            throw new MojoExecutionException("Unable to save data", e);
-        }
-    }
-
-    /**
-     * Read the contents of the model from an xml file.
-     */
-    public static Model loadModel(File infile) throws MojoExecutionException
-    {
-        FileReader reader = null;
-        try
-        {
-            reader = new FileReader(infile);
-            return readModel(reader);
-        }
-        catch (FileNotFoundException e)
-        {
-            throw new MojoExecutionException("No metadata file:" + infile);
-        }
-        finally
-        {
-            if (reader != null)
-            {
-                try
-                {
-                    reader.close();
-                }
-                catch (IOException e)
-                {
-                    // ignore
-                }
-            }
-        }
-    }
-    
-    public static boolean existsSourceFile(String filename, List sourceDirs)
-    {
-        boolean existsFile = false;            
-        for (int i = 0; i < sourceDirs.size(); i++)
-        {
-            String srcDir = (String) sourceDirs.get(i);
-            
-            //This directory that contains target/myfaces-builder-plugin/main
-            //is banned, all here is generated
-            //so we don't take a look at this directory
-            if (srcDir.matches(".*\\W+target\\W+myfaces-builder-plugin\\W+main\\W+.*"))
-            {
-                continue;
-            }                        
-            
-            File f = new File(srcDir,filename);
-            if (f.exists())
-            {
-                existsFile=true;
-                break;
-            }
-        }
-        return existsFile;
-    }
-    
-    public static Model getModelFromArtifact(Artifact artifact) 
-        throws MojoExecutionException
-    {
-        Model model = null;
-        File jarFile = artifact.getFile();
-
-        URLClassLoader archetypeJarLoader;
-
-        InputStream is = null;
-        try
-        {
-            URL[] urls = new URL[1];
-            urls[0] = jarFile.toURI().toURL();
-            archetypeJarLoader = new URLClassLoader(urls);
-
-            is = getStream(MYFACES_METADATA, archetypeJarLoader);
-
-            if (is != null)
-            {
-                Reader r = null;
-                try
-                {
-                    r = new InputStreamReader(is);
-                    model = readModel(r);
-                    r.close();
-                }
-                catch (IOException e)
-                {
-                    throw new MojoExecutionException(
-                            "Error reading myfaces-metadata.xml form "
-                                    + artifact.getFile().getName(), e);
-                }
-                finally
-                {
-                    if (r != null)
-                    {
-                        try
-                        {
-                            r.close();
-                        }
-                        catch (IOException e)
-                        {
-                            //ignore
-                        }
-                    }
-                }
-
-                System.out.println("Artifact: "
-                        + artifact.getFile().getName()
-                        + " have META-INF/myfaces-metadata.xml");
-            }
-        }
-        catch (IOException e)
-        {
-            throw new MojoExecutionException(
-                    "Error reading myfaces-metadata.xml form "
-                            + artifact.getFile().getName(), e);
-        }
-        finally
-        {
-            if (is != null)
-            {
-                try
-                {
-                    is.close();
-                }
-                catch (IOException ex)
-                {
-                    //ignore
-                }
-            }
-        }
-
-        return model;
-    }
-
-    /**
-     * Scan every jarfile that this maven project has a dependency on, looking for metadata files.
-     * <p>
-     * Each file found is loaded into memory as a Model object and added to the list.
-     */
-    public static List getModelsFromArtifacts(MavenProject project)
-            throws MojoExecutionException
-    {
-        List models = new ArrayList();
-        
-        for (Iterator it = project.getArtifacts().iterator(); it.hasNext();)
-        {
-
-            Artifact artifact = (Artifact) it.next();
-            
-            if ("compile".equals(artifact.getScope())
-                    || "provided".equals(artifact.getScope())
-                    || "system".equals(artifact.getScope()))
-            {
-                //This is safe since we have all depencencies on the
-                //pom, so they are downloaded first by maven.
-                File jarFile = artifact.getFile();
-
-                URLClassLoader archetypeJarLoader;
-
-                InputStream is = null;
-                try
-                {
-                    URL[] urls = new URL[1];
-                    urls[0] = jarFile.toURL();
-                    archetypeJarLoader = new URLClassLoader(urls);
-
-                    is = getStream(MYFACES_METADATA, archetypeJarLoader);
-
-                    if (is != null)
-                    {
-                        Reader r = null;
-                        try
-                        {
-                            r = new InputStreamReader(is);
-                            Model m = readModel(r);
-                            models.add(m);
-                            r.close();
-                        }
-                        catch (IOException e)
-                        {
-                            throw new MojoExecutionException(
-                                    "Error reading myfaces-metadata.xml form "
-                                            + artifact.getFile().getName(), e);
-                        }
-                        finally
-                        {
-                            if (r != null)
-                            {
-                                try
-                                {
-                                    r.close();
-                                }
-                                catch (IOException e)
-                                {
-                                    //ignore
-                                }
-                            }
-                        }
-
-                        System.out.println("Artifact: "
-                                + artifact.getFile().getName()
-                                + " have META-INF/myfaces-metadata.xml");
-                    }
-                }
-                catch (IOException e)
-                {
-                    throw new MojoExecutionException(
-                            "Error reading myfaces-metadata.xml form "
-                                    + artifact.getFile().getName(), e);
-                }
-                finally
-                {
-                    if (is != null)
-                    {
-                        try
-                        {
-                            is.close();
-                        }
-                        catch (IOException ex)
-                        {
-                            //ignore
-                        }
-                    }
-                }
-            }
-        }
-        return models;
-    }
-        
-    private static InputStream getStream( String name,
-            ClassLoader loader )
-    {
-        if ( loader == null )
-        {
-            return Thread.currentThread().getContextClassLoader().getResourceAsStream( name );
-        }
-        return loader.getResourceAsStream( name );
-    }
-    
-    /**
-     * Read the contents of the model from a provided Reader object.
-     */
-    public static Model readModel(Reader reader) throws MojoExecutionException
-    {
-        try
-        {
-            //Digester d = new Digester();
-            SAXParserFactory spf = SAXParserFactory.newInstance();
-            spf.setNamespaceAware(true);
-            // requires JAXP 1.3, in JavaSE 5.0
-            // spf.setXIncludeAware(true);
-            Digester d = new Digester(spf.newSAXParser());
-            d.setNamespaceAware(true);            
-
-            Model.addXmlRules(d);
-
-            d.parse(reader);
-
-            Model model = (Model) d.getRoot();
-            return model;
-        }
-        catch (IOException e)
-        {
-            throw new MojoExecutionException("Unable to load metadata", e);
-        }
-        catch (SAXException e)
-        {
-            throw new MojoExecutionException("Unable to load metadata", e);
-        }
-        catch (ParserConfigurationException e)
-        {
-            // TODO Auto-generated catch block
-            throw new MojoExecutionException("Unable to load parser", e);
-        }
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeComponentsMojo.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeComponentsMojo.java
deleted file mode 100644
index af4a142..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeComponentsMojo.java
+++ /dev/null
@@ -1,691 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-import java.util.logging.Logger;
-
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ComponentMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.utils.BuildException;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.utils.MyfacesUtils;
-import org.apache.velocity.Template;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.app.VelocityEngine;
-import org.apache.velocity.context.Context;
-import org.apache.velocity.runtime.RuntimeConstants;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.StringUtils;
-
-import com.thoughtworks.qdox.JavaDocBuilder;
-import com.thoughtworks.qdox.model.AbstractJavaEntity;
-import com.thoughtworks.qdox.model.Annotation;
-import com.thoughtworks.qdox.model.DocletTag;
-import com.thoughtworks.qdox.model.JavaClass;
-import com.thoughtworks.qdox.model.JavaField;
-import com.thoughtworks.qdox.model.JavaMethod;
-
-/**
- * Maven goal to generate java source code for Component classes.
- * 
- * <p>It uses velocity to generate templates, and has the option to define custom templates.</p>
- * <p>The executed template has the following variables available to it:</p>
- * <ul>
- *  <li>utils : Returns an instance of 
- *  org.apache.myfaces.buildtools.maven2.plugin.builder.utils.MyfacesUtils, 
- *  it contains some useful methods.</li>
- *  <li>component : Returns the current instance of
- *   org.apache.myfaces.buildtools.maven2.plugin.builder.model.ComponentMeta</li>
- *  <li>innersource : code to be injected from the template class when template
- *  mode is used</li>  
- * </ul>
- * 
- * @version $Id$
- * @requiresDependencyResolution compile
- * @goal make-components
- * @phase generate-sources
- */
-public class MakeComponentsMojo extends AbstractMojo
-{
-    final Logger log = Logger.getLogger(MakeComponentsMojo.class.getName());
-
-    /**
-     * Injected Maven project.
-     * 
-     * @parameter expression="${project}"
-     * @readonly
-     */
-    private MavenProject project;
-
-    /**
-     * Defines the directory where the metadata file (META-INF/myfaces-metadata.xml) is loaded.
-     * 
-     * @parameter expression="${project.build.directory}/myfaces-builder-plugin/main/resources"
-     * @readonly
-     */
-    private File buildDirectory;
-
-    /**
-     * Injected name of file generated by earlier run of BuildMetaDataMojo goal.
-     * 
-     * @parameter
-     */
-    private String metadataFile = "META-INF/myfaces-metadata.xml";
-
-    /**
-     * The directory used to load templates into velocity environment.
-     * 
-     * @parameter expression="src/main/resources/META-INF"
-     */
-    private File templateSourceDirectory;
-
-    /**
-     * The directory where all generated files are created. This directory is added as a
-     * compile source root automatically like src/main/java is. 
-     * 
-     * @parameter expression="${project.build.directory}/myfaces-builder-plugin/main/java"
-     */
-    private File generatedSourceDirectory;
-
-    /**
-     * Generate only component classes that starts with the specified package prefix. 
-     * 
-     * @parameter
-     */
-    private String packageContains;
-
-    /**
-     * Generate only component classes that starts with the specified component type prefix. 
-     * 
-     * @parameter
-     */
-    private String typePrefix;
-
-    /**
-     *  Log and continue execution when generating component classes.
-     *  <p>
-     *  If this property is set to false (default), errors when a component class is generated stops
-     *  execution immediately.
-     *  </p>
-     * 
-     * @parameter
-     */
-    private boolean force;
-
-    /**
-     * Defines the jsf version (1.1 or 1.2), used to take the default templates for each version.
-     * <p> 
-     * If version is 1.1, the default templateComponentName is 'componentClass11.vm' and if version
-     * is 1.2 the default templateComponentName is 'componentClass12.vm'.
-     * </p>
-     * 
-     * @parameter
-     */
-    private String jsfVersion;
-    
-    /**
-     * Define the models that should be included when generate component classes. If not set, the
-     * current model identified by the artifactId is used.
-     * <p>
-     * Each model built by build-metadata goal has a modelId, that by default is the artifactId of
-     * the project. Setting this property defines which objects tied in a specified modelId should
-     * be taken into account.  
-     * </p>
-     * <p>In this case, limit component generation only to the components defined in the models 
-     * identified by the modelId defined. </p>
-     * <p>This is useful when you need to generate files that take information defined on other
-     * projects</p>
-     * <p>Example:</p>
-     * <pre>
-     *    &lt;modelIds&gt;
-     *        &lt;modelId>model1&lt;/modelId&gt;
-     *        &lt;modelId>model2&lt;/modelId&gt;
-     *    &lt;/modelIds&gt;
-     * </pre>
-     * 
-     * @parameter
-     */
-    private List modelIds;
-
-    /**
-     * The name of the template used to generate component classes. According to the value on 
-     * jsfVersion property the default if this property is not set could be componentClass11.vm (1.1) or
-     * componentClass12.vm (1.2)
-     * 
-     * @parameter 
-     */
-    private String templateComponentName;
-    
-    /**
-     * This param is used to search in this folder if some file to
-     * be generated exists and avoid generation and duplicate exception.
-     * 
-     * @parameter expression="src/main/java"
-     */    
-    private File mainSourceDirectory;
-    
-    /**
-     * This param is used to search in this folder if some file to
-     * be generated exists and avoid generation and duplicate exception.
-     * 
-     * @parameter
-     */        
-    private File mainSourceDirectory2;
-
-    /**
-     * Execute the Mojo.
-     */
-    public void execute() throws MojoExecutionException
-    {
-        // This command makes Maven compile the generated source:
-        // getProject().addCompileSourceRoot( absoluteGeneratedPath.getPath() );
-        
-        try
-        {
-            project.addCompileSourceRoot( generatedSourceDirectory.getCanonicalPath() );
-            
-            if (modelIds == null)
-            {
-                modelIds = new ArrayList();
-                modelIds.add(project.getArtifactId());
-            }
-            Model model = IOUtils.loadModel(new File(buildDirectory,
-                    metadataFile));
-            new Flattener(model).flatten();
-            generateComponents(model);
-        }
-        catch (IOException e)
-        {
-            throw new MojoExecutionException("Error generating components", e);
-        }
-        catch (BuildException e)
-        {
-            throw new MojoExecutionException("Error generating components", e);
-        }
-    }
-    
-    
-    private VelocityEngine initVelocity() throws MojoExecutionException
-    {
-
-        Properties p = new Properties();
-
-        p.setProperty( "resource.loader", "file, class" );
-        p.setProperty( "file.resource.loader.class",
-                "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
-        p.setProperty( "file.resource.loader.path", templateSourceDirectory.getPath());
-        p.setProperty( "class.resource.loader.class",
-                "org.apache.myfaces.buildtools.maven2.plugin.builder.utils.RelativeClasspathResourceLoader" );
-        p.setProperty( "class.resource.loader.path", "META-INF");            
-        p.setProperty( "velocimacro.library", "componentClassMacros11.vm");
-        p.setProperty( "velocimacro.permissions.allow.inline","true");
-        p.setProperty( "velocimacro.permissions.allow.inline.local.scope", "true");
-        p.setProperty( "directive.foreach.counter.initial.value","0");
-        p.setProperty( RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
-        "org.apache.myfaces.buildtools.maven2.plugin.builder.utils.ConsoleLogSystem" );
-        
-        File template = new File(templateSourceDirectory, _getTemplateName());
-        
-        if (template.exists())
-        {
-            log.info("Using template from file loader: "+template.getPath());
-        }
-        else
-        {
-            log.info("Using template from class loader: META-INF/"+_getTemplateName());
-        }
-                
-        VelocityEngine velocityEngine = new VelocityEngine();
-                
-        try
-        {
-            velocityEngine.init(p);
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException("Error creating VelocityEngine", e);
-        }
-        
-        return velocityEngine;
-    }
-    
-
-    /**
-     * Generates parsed components.
-     */
-    private void generateComponents(Model model) throws IOException,
-            MojoExecutionException
-    {
-        // Make sure generated source directory 
-        // is added to compilation source path 
-        //project.addCompileSourceRoot(generatedSourceDirectory.getCanonicalPath());
-        
-        //Init Qdox for extract code 
-        JavaDocBuilder builder = new JavaDocBuilder();
-        
-        List sourceDirs = project.getCompileSourceRoots();
-        
-        // need a File object representing the original source tree
-        for (Iterator i = sourceDirs.iterator(); i.hasNext();)
-        {
-            String srcDir = (String) i.next();
-            builder.addSourceTree(new File(srcDir));
-        }        
-        
-        //Init velocity
-        VelocityEngine velocityEngine = initVelocity();
-
-        VelocityContext baseContext = new VelocityContext();
-        baseContext.put("utils", new MyfacesUtils());
-        
-        for (Iterator it = model.getComponents().iterator(); it.hasNext();)
-        {
-            ComponentMeta component = (ComponentMeta) it.next();
-            
-            if (component.getClassName() != null)
-            {
-                File f = new File(mainSourceDirectory, StringUtils.replace(
-                    component.getClassName(), ".", "/")+".java");
-                                
-                if (!f.exists() && canGenerateComponent(component))
-                {
-                    if (mainSourceDirectory2 != null)
-                    {
-                        File f2 = new File(mainSourceDirectory2, StringUtils.replace(
-                                component.getClassName(), ".", "/")+".java");
-                        if (f2.exists())
-                        {
-                            //Skip
-                            continue;
-                        }
-                    }
-                    log.info("Generating component class:"+component.getClassName());
-                    
-                    try 
-                    {
-                        _generateComponent(velocityEngine, builder,component,baseContext);
-                    }
-                    catch(MojoExecutionException e)
-                    {
-                        if (force)
-                        {
-                            log.severe(e.getMessage());
-                        }
-                        else
-                        {
-                            //Stop execution throwing exception
-                            throw e;
-                        }
-                    }
-                }
-            }
-        }        
-    }
-    
-    public boolean canGenerateComponent(ComponentMeta component)
-    {
-        if ( modelIds.contains(component.getModelId())
-                && includePackage(component)
-                && includeType(component))
-        {
-            return true;
-        }
-        else
-        {
-            return false;
-        }
-    }
-    
-    public boolean includePackage(ComponentMeta component)
-    {
-        if (packageContains != null)
-        {
-            if (MyfacesUtils.getPackageFromFullClass(component.getClassName()).startsWith(packageContains))
-            {
-                return true;
-            }
-            else
-            {
-                return false;
-            }
-        }
-        else
-        {
-            return true;
-        }        
-    }
-
-    public boolean includeType(ComponentMeta component)
-    {
-        if (typePrefix != null)
-        {
-            if (component.getType().startsWith(typePrefix))
-            {
-                return true;
-            }
-            else
-            {
-                return false;
-            }
-        }
-        else
-        {
-            return true;
-        }        
-    }
-    
-    
-    /**
-     * Generates a parsed component.
-     * 
-     * @param component
-     *            the parsed component metadata
-     */
-    private void _generateComponent(VelocityEngine velocityEngine,
-            JavaDocBuilder builder,
-            ComponentMeta component, VelocityContext baseContext)
-            throws MojoExecutionException
-    {
-        Context context = new VelocityContext(baseContext);
-        context.put("component", component);
-
-        if (Boolean.TRUE.equals(component.isTemplate()))
-        {
-            String source = this.getInnerSourceCode(builder, component);
-            
-            if (source != null && !"".equals(source))
-            {
-                context.put("innersource", source);
-            }
-        }        
-        
-        Writer writer = null;
-        File outFile = null;
-
-        try
-        {
-            outFile = new File(generatedSourceDirectory, StringUtils.replace(
-                    component.getClassName(), ".", "/")+".java");
-
-            if ( !outFile.getParentFile().exists() )
-            {
-                outFile.getParentFile().mkdirs();
-            }
-
-            writer = new OutputStreamWriter(new FileOutputStream(outFile));
-
-            Template template = velocityEngine.getTemplate(_getTemplateName());
-                        
-            template.merge(context, writer);
-
-            writer.flush();
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException(
-                    "Error merging velocity templates: " + e.getMessage(), e);
-        }
-        finally
-        {
-            IOUtil.close(writer);
-            writer = null;
-        }
-    }
-        
-    /**
-     * This method extract from component scanned sourceClass, the parts
-     * which we need to move to generated class as a single String using Qdox.
-     * 
-     * Ignore code that has a \@JSFExclude or \@JSFProperty Doclet or Annotation
-     * 
-     * @param component
-     * @return
-     */
-    private String getInnerSourceCode(JavaDocBuilder builder, ComponentMeta component)
-    {   
-        StringWriter writer = new StringWriter();
-        
-        JavaClass sourceClass = builder.getClassByName(component.getSourceClassName());
-        
-        JavaField [] fields = sourceClass.getFields();
-
-        //Include the fields defined
-        for (int i = 0; i < fields.length; i++)
-        {            
-            JavaField field = fields[i];
-            
-            DocletTag tag = field.getTagByName("JSFExclude");
-            Annotation anno = getAnnotation(field, "JSFExclude");
-            
-            if (!(tag == null && anno == null))
-            {
-                continue;
-            }
-                        
-            if (!isExcludedField(field.getName()))
-            {
-                writer.append("    ");
-                writer.append(field.getDeclarationSignature(true));
-                String initExpr = field.getInitializationExpression();
-                initExpr = cleanInitializationExpression(initExpr);
-                if (initExpr != null)
-                {
-                    writer.append(" = ");
-                    writer.append(initExpr);
-                }                
-                writer.append(';');
-                writer.append('\n');
-            }
-        }
-        
-        JavaMethod [] methods = sourceClass.getMethods();
-        for (int i = 0; i < methods.length; i++)
-        {
-            JavaMethod method = methods[i];
-
-            DocletTag tag = method.getTagByName("JSFExclude");
-            Annotation anno = getAnnotation(method, "JSFExclude");
-            
-            if (!(tag == null && anno == null))
-            {
-                continue;
-            }
-            
-            tag = method.getTagByName("JSFProperty", false);
-            anno = getAnnotation(method, "JSFProperty");
-            
-            if ( (tag == null && anno == null) || !method.isAbstract())
-            {              
-                //Get declaration signature in a way that we don't need
-                //to declare imports.
-                String declaration = method.getDeclarationSignature(true);
-                                
-                writer.append("    ");
-                writer.append(declaration);
-                String sourceCode = method.getSourceCode();
-                if(sourceCode != null && sourceCode.length() > 0)
-                {
-                    writer.append('\n');
-                    writer.append("    ");
-                    writer.append('{');
-                    writer.append(method.getSourceCode());
-                    writer.append('}');
-                    writer.append('\n');
-                    writer.append('\n');
-                }
-                else
-                {
-                    writer.append(';');
-                    writer.append('\n');
-                }
-            }
-            
-        }
-                
-        return writer.toString();
-    }
-    
-    private boolean isExcludedField(String name)
-    {
-        return (name.equals("COMPONENT_TYPE") || 
-                name.equals("DEFAULT_RENDERER_TYPE") ||
-                name.equals("COMPONENT_FAMILY") );
-    }
-
-    /**
-     * Clean up a field initialisation expression returned by qdox.
-     * <p>
-     * When a class has "int foo = 1;" then the initialisation expression
-     * is the bit after the equals sign. Unfortunately qdox tends to return
-     * a lot of garbage stuff in there. In particular, if there is no
-     * initialisation expression, then qdox can return a string with
-     * whitespace (not a null or empty string). 
-     * <p>
-     * In addition, if there are comments *before* a field declaration,
-     * they appear inside the initialisation text (this is just broken
-     * behaviour in qdox). Ideally we would move them to above the field
-     * declaration where they belong. However that is complicated and
-     * fragile, so we just discard them here.
-     */
-    static String cleanInitializationExpression(String expr)
-    {
-        expr = StringUtils.trim(expr);
-        if (StringUtils.isEmpty(expr))
-        {
-            return null;
-        }
-        
-        // split on linefeeds
-        // trim each separately
-        // remove any comment chars
-        
-        if (expr.contains("\n"))
-        {
-            StringBuffer buf = new StringBuffer(100);
-            String[] lines = StringUtils.split(expr, "\n");
-            for(int i=0; i<lines.length; ++i)
-            {
-                String line = lines[i];
-                line = StringUtils.trim(line);
-                if (!line.startsWith("//") && !StringUtils.isEmpty(line))
-                {
-                    if (buf.length()> 0)
-                    {
-                        buf.append(" ");
-                    }
-                    buf.append(line);
-                }
-            }
-            
-            expr = buf.toString();
-        }
-        
-        if (expr.startsWith("//"))
-        {
-            return null;
-        }
-
-        if (StringUtils.isEmpty(expr))
-        {
-            return null;
-        }
-
-        return expr;
-    }
-
-    /**
-     * TODO: Copied from QdoxModelBuilder!
-     * 
-     * @param entity
-     * @param annoName
-     * @return
-     */
-    private Annotation getAnnotation(AbstractJavaEntity entity, String annoName)
-    {
-        Annotation[] annos = entity.getAnnotations();
-        if (annos == null)
-        {
-            return null;
-        }
-        // String wanted = ANNOTATION_BASE + "." + annoName;
-        for (int i = 0; i < annos.length; ++i)
-        {
-            Annotation thisAnno = annos[i];
-            // Ideally, here we would check whether the fully-qualified name of
-            // the annotation
-            // class matches ANNOTATION_BASE + "." + annoName. However it
-            // appears that qdox 1.6.3
-            // does not correctly expand @Foo using the class import statements;
-            // method
-            // Annotation.getType.getJavaClass.getFullyQualifiedName still just
-            // returns the short
-            // class name. So for now, just check for the short name.
-            String thisAnnoName = thisAnno.getType().getJavaClass().getName();
-            
-            //Make short name for recognizing, if returns long
-            int containsPoint = thisAnnoName.lastIndexOf('.');
-            if (containsPoint != -1)
-            {
-                thisAnnoName = thisAnnoName.substring(containsPoint+1);
-            }
-            if (thisAnnoName.equals(annoName))
-            {
-                return thisAnno;
-            }
-        }
-        return null;
-    }    
-
-    private String _getTemplateName()
-    {
-        if (templateComponentName == null)
-        {
-            if (_is12())
-            {
-                return "componentClass12.vm";
-            }
-            else
-            {
-                return "componentClass11.vm";
-            }
-        }
-        else
-        {
-            return templateComponentName;
-        }
-    }
-    
-    private boolean _is12()
-    {
-        return "1.2".equals(jsfVersion) || "12".equals(jsfVersion);
-    }
-
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeConfigMojo.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeConfigMojo.java
deleted file mode 100644
index 669a26a..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeConfigMojo.java
+++ /dev/null
@@ -1,365 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.utils.BuildException;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.utils.MyfacesUtils;
-import org.apache.velocity.Template;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.app.VelocityEngine;
-import org.apache.velocity.exception.ParseErrorException;
-import org.apache.velocity.exception.ResourceNotFoundException;
-import org.apache.velocity.runtime.RuntimeConstants;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.xml.Xpp3Dom;
-import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
-import org.codehaus.plexus.util.xml.Xpp3DomWriter;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-
-/**
- * Creates taglib (tld) and faces-config files.
- * <p>
- * This Mojo actually provides a generic goal that will run a configurable
- * velocity template file and generate a single output file. The template is
- * passed the full metadata model object, and can select from the model whatever
- * data it wants.
- * </p>
- * <p>
- * The execution can be configured with:
- * <ul>
- * <li>The name of the input template to be executed</li>
- * <li>The name of the output file to be created</li>
- * <li>Any number of variables which are accessable from the template
- * (string values only)</li>
- * </ul>
- * </p>
- * <p>
- * The executed template has the following variables available to it:
- * <ul>
- * <li>model: the full metadata model for this project</li>
- * <li>modelIds: specifies which items from the model should be processed</li>
- * <li>baseContent: the full text of the contents of the "xmlBaseFile" (if any)</li>
- * <li>utils: an instance of MyfacesUtils that provides static helper methods</li>
- * <li>and whatever (name,value) pairs were configured via the "params" property
- * of this mojo.</li>
- * </ul>
- * </p>
- * 
- * @requiresDependencyResolution compile
- * @goal make-config
- * @phase generate-sources
- */
-public class MakeConfigMojo extends AbstractMojo
-{
-    /**
-     * The current maven project (auto-injected by Maven).
-     * 
-     * @parameter expression="${project}"
-     * @readonly
-     */
-    private MavenProject project;
-
-    /**
-     * Defines the directory where the metadata file (META-INF/myfaces-metadata.xml) is loaded,
-     * and the generated file named by xmlFile parameter is created. 
-     * 
-     * @parameter expression="${project.build.directory}/myfaces-builder-plugin/main/resources"
-     * @readonly
-     */
-    private File buildDirectory;
-
-    /**
-     * Name of the file from which the metadata model passed to the
-     * template will be read. This file is typically generated by an earlier
-     * execution of the BuildMetaDataMojo goal for the same maven project.
-     * 
-     * @parameter
-     */
-    private String metadataFile = "META-INF/myfaces-metadata.xml";
-
-    /**
-     * Specifies the name of the output file to be created.
-     * 
-     * @parameter
-     */
-    private String xmlFile = "META-INF/faces-config.xml";
-    
-    /**
-     * A list of metadata model ids.
-     * <p>
-     * If not defined, then this defaults to a list containing just one string whose
-     * value is the same as the current maven project's artifactId.
-     * </p>
-     * <p>
-     * The complete metadata model is passed to the velocity template. This contains 
-     * data about not just the model items defined in the calling project, but also
-     * about items imported from other projects. Each item in the model is
-     * labelled with a "model id" indicating which project it was defined by.
-     * </p>
-     * <p>
-     * This list of model ids is also passed to the template. The template can
-     * then use that data to select the relevant items from the full model.
-     * </p>
-     * 
-     * @parameter
-     */
-    private List modelIds;
-            
-    /**
-     * The base directory used when resolving references to external files from
-     * velocity #include and #parse commands within the executed template.
-     * 
-     * @parameter expression="src/main/resources/META-INF"
-     */
-    private File templateSourceDirectory;
-    
-    /**
-     * When defined, specifies an xml file whose top-level elements are to be copied
-     * directly into the created file.
-     * <p>
-     * This allows a hand-written file to be created containing data that cannot be
-     * automatically generated. All content beneath the root element of the specified
-     * file (but not the root element itself) is placed into a Velocity variable
-     * named "baseContent" that the template can reference.
-     * </p>
-     * <p>
-     * The template can do whatever it wants with this variable, but it is expected
-     * that the template will simply output this immediately after writing the
-     * root element of the output xml file.
-     * file.
-     * </p>
-     * <p>
-     * Note that any attributes or namespaces defined on the root element of the
-     * xmlBaseFile are ignored.
-     * </p>
-     * 
-     * @parameter expression="src/main/conf/META-INF/faces-config-base.xml"
-     */    
-    private File xmlBaseFile;
-
-    /**
-     * Specifies the Velocity template file to be executed.
-     * 
-     * @parameter expression="faces-config11.vm"
-     */
-    private String templateFile;
-    
-    /**
-     * A map of (name, value) pairs to be made available as Velocity variables
-     * for the executed template to access.
-     * 
-     * @parameter
-     */
-    private Map params;
-        
-    /**
-     * Execute the Mojo.
-     * <p>
-     * The metadata model is loaded, and the specified template is executed with
-     * any template output being written to the specified output file.
-     * </p>
-     */
-    public void execute() throws MojoExecutionException
-    {
-        try
-        {
-            if (modelIds == null)
-            {
-                modelIds = new ArrayList();
-                modelIds.add(project.getArtifactId());
-            }
-
-            // Load the metadata file from an xml file (presumably generated
-            // by an earlier execution of the build-metadata goal.
-            Model model = IOUtils.loadModel(new File(buildDirectory,
-                    metadataFile));
-
-            // Flatten the model so that the template can access every property
-            // of each model item directly, even when the property is actually
-            // defined on an ancestor class or interface.
-            new Flattener(model).flatten();
-
-            generateConfigFromVelocity(model);
-        }
-        catch (IOException e)
-        {
-            throw new MojoExecutionException("Error during config generation", e);
-        }
-        catch (BuildException e)
-        {
-            throw new MojoExecutionException("Error during config generation", e);
-        }
-    }
-    
-    private void generateConfigFromVelocity(Model model) throws IOException,
-        MojoExecutionException
-    {    
-        VelocityEngine velocityEngine = initVelocity();
-
-        VelocityContext baseContext = new VelocityContext();
-        baseContext.put("utils", new MyfacesUtils());
-        
-        String baseContent = "";
-        
-        if (xmlBaseFile != null && xmlBaseFile.exists())
-        {
-            getLog().info("using base content file: "+xmlBaseFile.getPath());
-            
-            Reader reader = null;
-            try
-            {
-                reader = new FileReader(xmlBaseFile);
-                Xpp3Dom root = Xpp3DomBuilder.build(reader);
-                
-                StringWriter writer = new StringWriter();
-                
-                Xpp3Dom [] children = root.getChildren();
-                
-                for (int i = 0; i< children.length; i++)
-                {
-                    Xpp3Dom dom = children[i];
-                    Xpp3DomWriter.write(writer, dom);
-                    writer.write('\n');
-                }
-                baseContent = writer.toString();
-                writer.close();
-            }
-            catch (XmlPullParserException e)
-            {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
-            finally
-            {
-                reader.close();
-            }
-        }
-        
-        baseContext.put("baseContent", baseContent);
-        
-        baseContext.put("model", model);
-        
-        baseContext.put("modelIds", modelIds);
-        
-        if (params != null)
-        {
-            //Load all parameters to the context, so the template can
-            //load it. This allow to generate any config file we want
-            //(faces-config, tld, facelet,....)
-            for (Iterator it = params.keySet().iterator(); it.hasNext();)
-            {
-                String key = (String) it.next();
-                baseContext.put(key,params.get(key));
-            }
-        }
-        
-        Writer writer = null;
-        File outFile = null;
-        
-        try
-        {
-            outFile = new File(buildDirectory, xmlFile);
-            
-            if ( !outFile.getParentFile().exists() )
-            {
-                outFile.getParentFile().mkdirs();
-            }
-            
-            writer = new OutputStreamWriter(new FileOutputStream(outFile));
-            
-            Template template = velocityEngine.getTemplate(templateFile);
-            
-            template.merge(baseContext, writer);
-
-            writer.flush();
-        }
-        catch (ResourceNotFoundException e)
-        {
-            throw new MojoExecutionException(
-                    "Error merging velocity templates: " + e.getMessage(), e);
-        }
-        catch (ParseErrorException e)
-        {
-            throw new MojoExecutionException(
-                    "Error merging velocity templates: " + e.getMessage(), e);
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException(
-                    "Error merging velocity templates: " + e.getMessage(), e);
-        }
-        finally
-        {
-            IOUtil.close(writer);
-            writer = null;
-        }        
-    }
-
-    private VelocityEngine initVelocity() throws MojoExecutionException
-    {
-
-        Properties p = new Properties();
-
-        p.setProperty( "resource.loader", "file, class" );
-        p.setProperty( "file.resource.loader.class",
-                "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
-        p.setProperty( "file.resource.loader.path", templateSourceDirectory.getPath());
-        p.setProperty( "class.resource.loader.class",
-                "org.apache.myfaces.buildtools.maven2.plugin.builder.utils.RelativeClasspathResourceLoader" );
-        p.setProperty( "class.resource.loader.path", "META-INF");            
-        p.setProperty( "velocimacro.library", "xmlMacros.vm");
-        p.setProperty( "velocimacro.permissions.allow.inline","true");
-        p.setProperty( "velocimacro.permissions.allow.inline.local.scope", "true");
-        p.setProperty( "directive.foreach.counter.initial.value","0");
-        p.setProperty( RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
-        "org.apache.myfaces.buildtools.maven2.plugin.builder.utils.ConsoleLogSystem" );
-                        
-        VelocityEngine velocityEngine = new VelocityEngine();
-                
-        try
-        {
-            velocityEngine.init(p);
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException("Error creating VelocityEngine", e);
-        }
-        
-        return velocityEngine;
-    }
-    
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeConverterTagsMojo.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeConverterTagsMojo.java
deleted file mode 100644
index c26fd93..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeConverterTagsMojo.java
+++ /dev/null
@@ -1,446 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-import java.util.logging.Logger;
-
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ConverterMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.utils.BuildException;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.utils.MyfacesUtils;
-import org.apache.velocity.Template;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.app.VelocityEngine;
-import org.apache.velocity.context.Context;
-import org.apache.velocity.runtime.RuntimeConstants;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.StringUtils;
-
-/**
- * Maven goal to generate java source code for Component tag classes.
- * 
- * <p>It uses velocity to generate templates, and has the option to define custom templates.</p>
- * <p>The executed template has the following variables available to it:</p>
- * <ul>
- *  <li>utils : Returns an instance of 
- *  org.apache.myfaces.buildtools.maven2.plugin.builder.utils.MyfacesUtils, 
- *  it contains some useful methods.</li>
- *  <li>converter : Returns the current instance of
- *   org.apache.myfaces.buildtools.maven2.plugin.builder.model.ConverterMeta</li>
- * </ul>
- * 
- * @version $Id$
- * @requiresDependencyResolution compile
- * @goal make-converter-tags
- * @phase generate-sources
- */
-public class MakeConverterTagsMojo extends AbstractMojo
-{
-    final Logger log = Logger.getLogger(MakeConverterTagsMojo.class.getName());
-
-    /**
-     * Injected Maven project.
-     * 
-     * @parameter expression="${project}"
-     * @readonly
-     */
-    private MavenProject project;
-
-    /**
-     * Defines the directory where the metadata file (META-INF/myfaces-metadata.xml) is loaded.
-     * 
-     * @parameter expression="${project.build.directory}/myfaces-builder-plugin/main/resources"
-     * @readonly
-     */
-    private File buildDirectory;
-
-    /**
-     * Injected name of file generated by earlier run of BuildMetaDataMojo goal.
-     * 
-     * @parameter
-     */
-    private String metadataFile = "META-INF/myfaces-metadata.xml";
-
-    /**
-     * The directory used to load templates into velocity environment.
-     * 
-     * @parameter expression="src/main/resources/META-INF"
-     */
-    private File templateSourceDirectory;
-    
-    /**
-     * This param is used to search in this folder if some file to
-     * be generated exists and avoid generation and duplicate exception.
-     * 
-     * @parameter expression="src/main/java"
-     */    
-    private File mainSourceDirectory;
-
-    /**
-     * This param is used to search in this folder if some file to
-     * be generated exists and avoid generation and duplicate exception.
-     * 
-     * @parameter
-     */        
-    private File mainSourceDirectory2;
-
-    /**
-     * The name of the template used to generate converter tag classes. According to the value on 
-     * jsfVersion property the default if this property is not set could be tagConverterClass11.vm (1.1) or
-     * tagConverterClass12.vm (1.2)
-     * 
-     * @parameter 
-     */
-    private String templateTagName;
-
-    /**
-     * The directory where all generated files are created. This directory is added as a
-     * compile source root automatically like src/main/java is. 
-     * 
-     * @parameter expression="${project.build.directory}/myfaces-builder-plugin/main/java"
-     * @required
-     */
-    private File generatedSourceDirectory;
-
-    /**
-     * Only generate tag classes that contains that package prefix
-     * 
-     * @parameter
-     */
-    private String packageContains;
-
-    /**
-     * Only generate tag classes that its component starts with this type prefix
-     * 
-     * @parameter
-     */
-    private String typePrefix;
-    
-    /**
-     *  Log and continue execution when generating converter tag classes.
-     *  <p>
-     *  If this property is set to false (default), errors when a converter tag class is generated stops
-     *  execution immediately.
-     *  </p>
-     * 
-     * @parameter
-     */
-    private boolean force;
-
-    /**
-     * Defines the jsf version (1.1 or 1.2), used to take the default templates for each version.
-     * <p> 
-     * If version is 1.1, the default templateTagName is 'tagConverterClass11.vm' and if version
-     * is 1.2 the default templateTagName is 'tagConverterClass12.vm'.
-     * </p>
-     * 
-     * @parameter
-     */
-    private String jsfVersion;
-    
-    /**
-     * Define the models that should be included when generate converter tag classes. If not set, the
-     * current model identified by the artifactId is used.
-     * <p>
-     * Each model built by build-metadata goal has a modelId, that by default is the artifactId of
-     * the project. Setting this property defines which objects tied in a specified modelId should
-     * be taken into account.  
-     * </p>
-     * <p>In this case, limit converter tag generation only to the components defined in the models 
-     * identified by the modelId defined. </p>
-     * <p>This is useful when you need to generate files that take information defined on other
-     * projects.</p>
-     * <p>Example:</p>
-     * <pre>
-     *    &lt;modelIds&gt;
-     *        &lt;modelId>model1&lt;/modelId&gt;
-     *        &lt;modelId>model2&lt;/modelId&gt;
-     *    &lt;/modelIds&gt;
-     * </pre>
-     * 
-     * @parameter
-     */
-    private List modelIds;
-    
-    /**
-     * Execute the Mojo.
-     */
-    public void execute() throws MojoExecutionException
-    {
-        // This command makes Maven compile the generated source:
-        // getProject().addCompileSourceRoot( absoluteGeneratedPath.getPath() );
-        try
-        {
-            project.addCompileSourceRoot( generatedSourceDirectory.getCanonicalPath() );
-            
-            if (modelIds == null)
-            {
-                modelIds = new ArrayList();
-                modelIds.add(project.getArtifactId());
-            }
-            Model model = IOUtils.loadModel(new File(buildDirectory,
-                    metadataFile));
-            new Flattener(model).flatten();
-            generateConverters(model);
-        }
-        catch (IOException e)
-        {
-            throw new MojoExecutionException("Error generating components", e);
-        }
-        catch (BuildException e)
-        {
-            throw new MojoExecutionException("Error generating components", e);
-        }
-    }
-        
-    private VelocityEngine initVelocity() throws MojoExecutionException
-    {
-
-        Properties p = new Properties();
-
-        p.setProperty( "resource.loader", "file, class" );
-        p.setProperty( "file.resource.loader.class",
-                "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
-        p.setProperty( "file.resource.loader.path", templateSourceDirectory.getPath());
-        p.setProperty( "class.resource.loader.class",
-                "org.apache.myfaces.buildtools.maven2.plugin.builder.utils.RelativeClasspathResourceLoader" );
-        p.setProperty( "class.resource.loader.path", "META-INF");            
-        p.setProperty( "velocimacro.library", "tagClassMacros11.vm");
-        p.setProperty( "velocimacro.permissions.allow.inline","true");
-        p.setProperty( "velocimacro.permissions.allow.inline.local.scope", "true");
-        p.setProperty( "directive.foreach.counter.initial.value","0");
-        p.setProperty( RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
-        "org.apache.myfaces.buildtools.maven2.plugin.builder.utils.ConsoleLogSystem" );
-        
-        File template = new File(templateSourceDirectory, _getTemplateTagName());
-        
-        if (template.exists())
-        {
-            log.info("Using template from file loader: "+template.getPath());
-        }
-        else
-        {
-            log.info("Using template from class loader: META-INF/"+_getTemplateTagName());
-        }
-                
-        VelocityEngine velocityEngine = new VelocityEngine();
-                
-        try
-        {
-            velocityEngine.init(p);
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException("Error creating VelocityEngine", e);
-        }
-        
-        return velocityEngine;
-    }
-
-    /**
-     * Generates parsed components.
-     */
-    private void generateConverters(Model model) throws IOException,
-            MojoExecutionException
-    {
-        VelocityEngine velocityEngine = initVelocity();
-
-        VelocityContext baseContext = new VelocityContext();
-        baseContext.put("utils", new MyfacesUtils());
-        
-        for (Iterator it = model.getConverters().iterator(); it.hasNext();)
-        {
-            ConverterMeta converter = (ConverterMeta) it.next();
-            
-            if (converter.getTagClass() != null)
-            {
-                File f = new File(mainSourceDirectory, StringUtils.replace(
-                    converter.getTagClass(), ".", "/")+".java");
-                
-                if (!f.exists() && canGenerateConverterTag(converter))
-                {
-                    if (mainSourceDirectory2 != null)
-                    {
-                        File f2 = new File(mainSourceDirectory2, StringUtils.replace(
-                                converter.getTagClass(), ".", "/")+".java");
-                        if (f2.exists())
-                        {
-                            //Skip
-                            continue;
-                        }
-                    }
-                    log.info("Generating tag class:"+converter.getTagClass());
-                    try
-                    {
-                        _generateConverter(velocityEngine, converter,baseContext);
-                    }
-                    catch(MojoExecutionException e)
-                    {
-                        if (force)
-                        {
-                            log.severe(e.getMessage());
-                        }
-                        else
-                        {
-                            //Stop execution throwing exception
-                            throw e;
-                        }
-                    }
-                }
-            }
-        }
-        //throw new MojoExecutionException("stopping..");
-    }
-    
-    public boolean canGenerateConverterTag(ConverterMeta component)
-    {
-        if ( modelIds.contains(component.getModelId())
-                && includePackage(component)
-                && includeId(component))
-        {
-            return true;
-        }
-        else
-        {
-            return false;
-        }
-    }
-    
-    public boolean includePackage(ConverterMeta converter)
-    {
-        if (packageContains != null)
-        {
-            if (MyfacesUtils.getPackageFromFullClass(converter.getTagClass()).startsWith(packageContains))
-            {
-                return true;
-            }
-            else
-            {
-                return false;
-            }
-        }
-        else
-        {
-            return true;
-        }        
-    }
-
-    public boolean includeId(ConverterMeta converter)
-    {
-        if (typePrefix != null)
-        {
-            if (converter.getConverterId().startsWith(typePrefix))
-            {
-                return true;
-            }
-            else
-            {
-                return false;
-            }
-        }
-        else
-        {
-            return true;
-        }        
-    }
-
-
-    /**
-     * Generates a parsed component.
-     * 
-     * @param converter
-     *            the parsed component metadata
-     */
-    private void _generateConverter(VelocityEngine velocityEngine, ConverterMeta converter, VelocityContext baseContext)
-            throws MojoExecutionException
-    {
-
-        Context context = new VelocityContext(baseContext);
-        context.put("converter", converter);
-
-        Writer writer = null;
-        File outFile = null;
-
-        try
-        {
-            outFile = new File(generatedSourceDirectory, StringUtils.replace(
-                    converter.getTagClass(), ".", "/")+".java");
-
-            if ( !outFile.getParentFile().exists() )
-            {
-                outFile.getParentFile().mkdirs();
-            }
-
-            writer = new OutputStreamWriter(new FileOutputStream(outFile));
-
-            Template template = velocityEngine.getTemplate(_getTemplateTagName());
-                        
-            template.merge(context, writer);
-
-            writer.flush();
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException(
-                    "Error merging velocity templates: " + e.getMessage(), e);
-        }
-        finally
-        {
-            IOUtil.close(writer);
-            writer = null;
-        }
-    }
-    
-    private String _getTemplateTagName()
-    {
-        if (templateTagName == null)
-        {
-            if (_is12())
-            {
-                return "tagConverterClass12.vm";
-            }
-            else
-            {
-                return "tagConverterClass11.vm";
-            }
-        }
-        else
-        {
-            return templateTagName;
-        }
-    }
-
-    private boolean _is12()
-    {
-        return "1.2".equals(jsfVersion) || "12".equals(jsfVersion);
-    }
-
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeTagsMojo.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeTagsMojo.java
deleted file mode 100644
index f55ff39..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeTagsMojo.java
+++ /dev/null
@@ -1,446 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-import java.util.logging.Logger;
-
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ComponentMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.utils.BuildException;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.utils.MyfacesUtils;
-import org.apache.velocity.Template;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.app.VelocityEngine;
-import org.apache.velocity.context.Context;
-import org.apache.velocity.runtime.RuntimeConstants;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.StringUtils;
-
-/**
- * Maven goal to generate java source code for Component tag classes.
- * 
- * <p>It uses velocity to generate templates, and has the option to define custom templates.</p>
- * <p>The executed template has the following variables available to it:</p>
- * <ul>
- *  <li>utils : Returns an instance of 
- *  org.apache.myfaces.buildtools.maven2.plugin.builder.utils.MyfacesUtils, 
- *  it contains some useful methods.</li>
- *  <li>component : Returns the current instance of
- *   org.apache.myfaces.buildtools.maven2.plugin.builder.model.ComponentMeta</li>
- * </ul>
- * 
- * @version $Id$
- * @requiresDependencyResolution compile
- * @goal make-tags
- * @phase generate-sources
- */
-public class MakeTagsMojo extends AbstractMojo
-{
-    final Logger log = Logger.getLogger(MakeTagsMojo.class.getName());
-
-    /**
-     * Injected Maven project.
-     * 
-     * @parameter expression="${project}"
-     * @readonly
-     */
-    private MavenProject project;
-
-    /**
-     * Defines the directory where the metadata file (META-INF/myfaces-metadata.xml) is loaded.
-     * 
-     * @parameter expression="${project.build.directory}/myfaces-builder-plugin/main/resources"
-     * @readonly
-     */
-    private File buildDirectory;
-
-    /**
-     * Injected name of file generated by earlier run of BuildMetaDataMojo goal.
-     * 
-     * @parameter
-     */
-    private String metadataFile = "META-INF/myfaces-metadata.xml";
-
-    /**
-     * The directory used to load templates into velocity environment.
-     * 
-     * @parameter expression="src/main/resources/META-INF"
-     */
-    private File templateSourceDirectory;
-    
-    /**
-     * This param is used to search in this folder if some file to
-     * be generated exists and avoid generation and duplicate exception.
-     * 
-     * @parameter expression="src/main/java"
-     */    
-    private File mainSourceDirectory;
-
-    /**
-     * This param is used to search in this folder if some file to
-     * be generated exists and avoid generation and duplicate exception.
-     * 
-     * @parameter
-     */        
-    private File mainSourceDirectory2;
-
-    /**
-     * The name of the template used to generate component tag classes. According to the value on 
-     * jsfVersion property the default if this property is not set could be tagClass11.vm (1.1) or
-     * tagClass12.vm (1.2)
-     * 
-     * @parameter 
-     */
-    private String templateTagName;
-
-    /**
-     * The directory where all generated files are created. This directory is added as a
-     * compile source root automatically like src/main/java is. 
-     * 
-     * @parameter expression="${project.build.directory}/myfaces-builder-plugin/main/java"
-     * @required
-     */
-    private File generatedSourceDirectory;
-
-    /**
-     * Only generate tag classes that contains that package prefix
-     * 
-     * @parameter
-     */
-    private String packageContains;
-
-    /**
-     * Only generate tag classes that its component starts with this type prefix
-     * 
-     * @parameter
-     */
-    private String typePrefix;
-    
-    /**
-     *  Log and continue execution when generating component tag classes.
-     *  <p>
-     *  If this property is set to false (default), errors when a component tag class is generated stops
-     *  execution immediately.
-     *  </p>
-     * 
-     * @parameter
-     */
-    private boolean force;
-
-    /**
-     * Defines the jsf version (1.1 or 1.2), used to take the default templates for each version.
-     * <p> 
-     * If version is 1.1, the default templateTagName is 'tagClass11.vm' and if version
-     * is 1.2 the default templateTagName is 'tagClass12.vm'.
-     * </p>
-     * 
-     * @parameter
-     */
-    private String jsfVersion;
-    
-    /**
-     * Define the models that should be included when generate component tag classes. If not set, the
-     * current model identified by the artifactId is used.
-     * <p>
-     * Each model built by build-metadata goal has a modelId, that by default is the artifactId of
-     * the project. Setting this property defines which objects tied in a specified modelId should
-     * be taken into account.  
-     * </p>
-     * <p>In this case, limit component tag generation only to the components defined in the models 
-     * identified by the modelId defined. </p>
-     * <p>This is useful when you need to generate files that take information defined on other
-     * projects.</p>
-     * <p>Example:</p>
-     * <pre>
-     *    &lt;modelIds&gt;
-     *        &lt;modelId>model1&lt;/modelId&gt;
-     *        &lt;modelId>model2&lt;/modelId&gt;
-     *    &lt;/modelIds&gt;
-     * </pre>
-     * 
-     * @parameter
-     */
-    private List modelIds;
-    
-    /**
-     * Execute the Mojo.
-     */
-    public void execute() throws MojoExecutionException
-    {
-        // This command makes Maven compile the generated source:
-        // getProject().addCompileSourceRoot( absoluteGeneratedPath.getPath() );
-        try
-        {
-            project.addCompileSourceRoot( generatedSourceDirectory.getCanonicalPath() );
-            
-            if (modelIds == null)
-            {
-                modelIds = new ArrayList();
-                modelIds.add(project.getArtifactId());
-            }
-            Model model = IOUtils.loadModel(new File(buildDirectory,
-                    metadataFile));
-            new Flattener(model).flatten();
-            generateComponents(model);
-        }
-        catch (IOException e)
-        {
-            throw new MojoExecutionException("Error generating components", e);
-        }
-        catch (BuildException e)
-        {
-            throw new MojoExecutionException("Error generating components", e);
-        }
-    }
-        
-    private VelocityEngine initVelocity() throws MojoExecutionException
-    {
-
-        Properties p = new Properties();
-
-        p.setProperty( "resource.loader", "file, class" );
-        p.setProperty( "file.resource.loader.class",
-                "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
-        p.setProperty( "file.resource.loader.path", templateSourceDirectory.getPath());
-        p.setProperty( "class.resource.loader.class",
-                "org.apache.myfaces.buildtools.maven2.plugin.builder.utils.RelativeClasspathResourceLoader" );
-        p.setProperty( "class.resource.loader.path", "META-INF");            
-        p.setProperty( "velocimacro.library", "tagClassMacros11.vm");
-        p.setProperty( "velocimacro.permissions.allow.inline","true");
-        p.setProperty( "velocimacro.permissions.allow.inline.local.scope", "true");
-        p.setProperty( "directive.foreach.counter.initial.value","0");
-        p.setProperty( RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
-        "org.apache.myfaces.buildtools.maven2.plugin.builder.utils.ConsoleLogSystem" );
-        
-        File template = new File(templateSourceDirectory, _getTemplateTagName());
-        
-        if (template.exists())
-        {
-            log.info("Using template from file loader: "+template.getPath());
-        }
-        else
-        {
-            log.info("Using template from class loader: META-INF/"+_getTemplateTagName());
-        }
-                
-        VelocityEngine velocityEngine = new VelocityEngine();
-                
-        try
-        {
-            velocityEngine.init(p);
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException("Error creating VelocityEngine", e);
-        }
-        
-        return velocityEngine;
-    }
-
-    /**
-     * Generates parsed components.
-     */
-    private void generateComponents(Model model) throws IOException,
-            MojoExecutionException
-    {
-        VelocityEngine velocityEngine = initVelocity();
-
-        VelocityContext baseContext = new VelocityContext();
-        baseContext.put("utils", new MyfacesUtils());
-        
-        for (Iterator it = model.getComponents().iterator(); it.hasNext();)
-        {
-            ComponentMeta component = (ComponentMeta) it.next();
-            
-            if (component.getTagClass() != null)
-            {
-                File f = new File(mainSourceDirectory, StringUtils.replace(
-                    component.getTagClass(), ".", "/")+".java");
-                
-                if (!f.exists() && canGenerateComponentTag(component))
-                {
-                    if (mainSourceDirectory2 != null)
-                    {
-                        File f2 = new File(mainSourceDirectory2, StringUtils.replace(
-                                component.getTagClass(), ".", "/")+".java");
-                        if (f2.exists())
-                        {
-                            //Skip
-                            continue;
-                        }
-                    }
-                    log.info("Generating tag class:"+component.getTagClass());
-                    try 
-                    {
-                        _generateComponent(velocityEngine, component,baseContext);
-                    }
-                    catch(MojoExecutionException e)
-                    {
-                        if (force)
-                        {
-                            log.severe(e.getMessage());
-                        }
-                        else
-                        {
-                            //Stop execution throwing exception
-                            throw e;
-                        }
-                    }
-                }
-            }
-        }
-        //throw new MojoExecutionException("stopping..");
-    }
-    
-    public boolean canGenerateComponentTag(ComponentMeta component)
-    {
-        if ( modelIds.contains(component.getModelId())
-                && includePackage(component)
-                && includeType(component))
-        {
-            return true;
-        }
-        else
-        {
-            return false;
-        }
-    }
-    
-    public boolean includePackage(ComponentMeta component)
-    {
-        if (packageContains != null)
-        {
-            if (component.getTagPackage().startsWith(packageContains))
-            {
-                return true;
-            }
-            else
-            {
-                return false;
-            }
-        }
-        else
-        {
-            return true;
-        }        
-    }
-
-    public boolean includeType(ComponentMeta component)
-    {
-        if (typePrefix != null)
-        {
-            if (component.getType().startsWith(typePrefix))
-            {
-                return true;
-            }
-            else
-            {
-                return false;
-            }
-        }
-        else
-        {
-            return true;
-        }        
-    }
-
-
-    /**
-     * Generates a parsed component.
-     * 
-     * @param component
-     *            the parsed component metadata
-     */
-    private void _generateComponent(VelocityEngine velocityEngine, ComponentMeta component, VelocityContext baseContext)
-            throws MojoExecutionException
-    {
-
-        Context context = new VelocityContext(baseContext);
-        context.put("component", component);
-
-        Writer writer = null;
-        File outFile = null;
-
-        try
-        {
-            outFile = new File(generatedSourceDirectory, StringUtils.replace(
-                    component.getTagClass(), ".", "/")+".java");
-
-            if ( !outFile.getParentFile().exists() )
-            {
-                outFile.getParentFile().mkdirs();
-            }
-
-            writer = new OutputStreamWriter(new FileOutputStream(outFile));
-
-            Template template = velocityEngine.getTemplate(_getTemplateTagName());
-                        
-            template.merge(context, writer);
-
-            writer.flush();
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException(
-                    "Error merging velocity templates: " + e.getMessage(), e);
-        }
-        finally
-        {
-            IOUtil.close(writer);
-            writer = null;
-        }
-    }
-    
-    private String _getTemplateTagName()
-    {
-        if (templateTagName == null)
-        {
-            if (_is12())
-            {
-                return "tagClass12.vm";
-            }
-            else
-            {
-                return "tagClass11.vm";
-            }
-        }
-        else
-        {
-            return templateTagName;            
-        }        
-    }
-
-    private boolean _is12()
-    {
-        return "1.2".equals(jsfVersion) || "12".equals(jsfVersion);
-    }
-
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeValidatorTagsMojo.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeValidatorTagsMojo.java
deleted file mode 100644
index 8bb761f..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeValidatorTagsMojo.java
+++ /dev/null
@@ -1,446 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-import java.util.logging.Logger;
-
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ValidatorMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.utils.BuildException;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.utils.MyfacesUtils;
-import org.apache.velocity.Template;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.app.VelocityEngine;
-import org.apache.velocity.context.Context;
-import org.apache.velocity.runtime.RuntimeConstants;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.StringUtils;
-
-/**
- * Maven goal to generate java source code for Component tag classes.
- * 
- * <p>It uses velocity to generate templates, and has the option to define custom templates.</p>
- * <p>The executed template has the following variables available to it:</p>
- * <ul>
- *  <li>utils : Returns an instance of 
- *  org.apache.myfaces.buildtools.maven2.plugin.builder.utils.MyfacesUtils, 
- *  it contains some useful methods.</li>
- *  <li>validator : Returns the current instance of
- *   org.apache.myfaces.buildtools.maven2.plugin.builder.model.ValidatorMeta</li>
- * </ul>
- * 
- * @version $Id$
- * @requiresDependencyResolution compile
- * @goal make-validator-tags
- * @phase generate-sources
- */
-public class MakeValidatorTagsMojo extends AbstractMojo
-{
-    final Logger log = Logger.getLogger(MakeValidatorTagsMojo.class.getName());
-
-    /**
-     * Injected Maven project.
-     * 
-     * @parameter expression="${project}"
-     * @readonly
-     */
-    private MavenProject project;
-
-    /**
-     * Defines the directory where the metadata file (META-INF/myfaces-metadata.xml) is loaded.
-     * 
-     * @parameter expression="${project.build.directory}/myfaces-builder-plugin/main/resources"
-     * @readonly
-     */
-    private File buildDirectory;
-
-    /**
-     * Injected name of file generated by earlier run of BuildMetaDataMojo goal.
-     * 
-     * @parameter
-     */
-    private String metadataFile = "META-INF/myfaces-metadata.xml";
-
-    /**
-     * The directory used to load templates into velocity environment.
-     * 
-     * @parameter expression="src/main/resources/META-INF"
-     */
-    private File templateSourceDirectory;
-    
-    /**
-     * This param is used to search in this folder if some file to
-     * be generated exists and avoid generation and duplicate exception.
-     * 
-     * @parameter expression="src/main/java"
-     */    
-    private File mainSourceDirectory;
-
-    /**
-     * This param is used to search in this folder if some file to
-     * be generated exists and avoid generation and duplicate exception.
-     * 
-     * @parameter
-     */        
-    private File mainSourceDirectory2;
-
-    /**
-     * The name of the template used to generate validator tag classes. According to the value on 
-     * jsfVersion property the default if this property is not set could be tagValidatorClass11.vm (1.1) or
-     * tagValidatorClass12.vm (1.2)
-     * 
-     * @parameter 
-     */
-    private String templateTagName;
-
-    /**
-     * The directory where all generated files are created. This directory is added as a
-     * compile source root automatically like src/main/java is. 
-     *  
-     * @parameter expression="${project.build.directory}/myfaces-builder-plugin/main/java"
-     * @required
-     */
-    private File generatedSourceDirectory;
-
-    /**
-     * Only generate tag classes that contains that package prefix
-     * 
-     * @parameter
-     */
-    private String packageContains;
-
-    /**
-     * Only generate tag classes that its component starts with this type prefix
-     * 
-     * @parameter
-     */
-    private String typePrefix;
-    
-    /**
-     *  Log and continue execution when generating validator tag classes.
-     *  <p>
-     *  If this property is set to false (default), errors when a validator tag class is generated stops
-     *  execution immediately.
-     *  </p>
-     * 
-     * @parameter
-     */
-    private boolean force;
-
-    /**
-     * Defines the jsf version (1.1 or 1.2), used to take the default templates for each version.
-     * <p> 
-     * If version is 1.1, the default templateTagName is 'tagValidatorClass11.vm' and if version
-     * is 1.2 the default templateTagName is 'tagValidatorClass12.vm'.
-     * </p>
-     * 
-     * @parameter
-     */
-    private String jsfVersion;
-    
-    /**
-     * Define the models that should be included when generate validator tag classes. If not set, the
-     * current model identified by the artifactId is used.
-     * <p>
-     * Each model built by build-metadata goal has a modelId, that by default is the artifactId of
-     * the project. Setting this property defines which objects tied in a specified modelId should
-     * be taken into account.  
-     * </p>
-     * <p>In this case, limit converter tag generation only to the components defined in the models 
-     * identified by the modelId defined. </p>
-     * <p>This is useful when you need to generate files that take information defined on other
-     * projects.</p>
-     * <p>Example:</p>
-     * <pre>
-     *    &lt;modelIds&gt;
-     *        &lt;modelId>model1&lt;/modelId&gt;
-     *        &lt;modelId>model2&lt;/modelId&gt;
-     *    &lt;/modelIds&gt;
-     * </pre>
-     * 
-     * @parameter
-     */
-    private List modelIds;
-    
-    /**
-     * Execute the Mojo.
-     */
-    public void execute() throws MojoExecutionException
-    {
-        // This command makes Maven compile the generated source:
-        // getProject().addCompileSourceRoot( absoluteGeneratedPath.getPath() );
-        try
-        {
-            project.addCompileSourceRoot( generatedSourceDirectory.getCanonicalPath() );
-            
-            if (modelIds == null)
-            {
-                modelIds = new ArrayList();
-                modelIds.add(project.getArtifactId());
-            }
-            Model model = IOUtils.loadModel(new File(buildDirectory,
-                    metadataFile));
-            new Flattener(model).flatten();
-            generateValidators(model);
-        }
-        catch (IOException e)
-        {
-            throw new MojoExecutionException("Error generating components", e);
-        }
-        catch (BuildException e)
-        {
-            throw new MojoExecutionException("Error generating components", e);
-        }
-    }
-        
-    private VelocityEngine initVelocity() throws MojoExecutionException
-    {
-
-        Properties p = new Properties();
-
-        p.setProperty( "resource.loader", "file, class" );
-        p.setProperty( "file.resource.loader.class",
-                "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
-        p.setProperty( "file.resource.loader.path", templateSourceDirectory.getPath());
-        p.setProperty( "class.resource.loader.class",
-                "org.apache.myfaces.buildtools.maven2.plugin.builder.utils.RelativeClasspathResourceLoader" );
-        p.setProperty( "class.resource.loader.path", "META-INF");            
-        p.setProperty( "velocimacro.library", "tagClassMacros11.vm");
-        p.setProperty( "velocimacro.permissions.allow.inline","true");
-        p.setProperty( "velocimacro.permissions.allow.inline.local.scope", "true");
-        p.setProperty( "directive.foreach.counter.initial.value","0");
-        p.setProperty( RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
-        "org.apache.myfaces.buildtools.maven2.plugin.builder.utils.ConsoleLogSystem" );
-        
-        File template = new File(templateSourceDirectory, _getTemplateTagName());
-        
-        if (template.exists())
-        {
-            log.info("Using template from file loader: "+template.getPath());
-        }
-        else
-        {
-            log.info("Using template from class loader: META-INF/"+_getTemplateTagName());
-        }
-                
-        VelocityEngine velocityEngine = new VelocityEngine();
-                
-        try
-        {
-            velocityEngine.init(p);
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException("Error creating VelocityEngine", e);
-        }
-        
-        return velocityEngine;
-    }
-
-    /**
-     * Generates parsed components.
-     */
-    private void generateValidators(Model model) throws IOException,
-            MojoExecutionException
-    {
-        VelocityEngine velocityEngine = initVelocity();
-
-        VelocityContext baseContext = new VelocityContext();
-        baseContext.put("utils", new MyfacesUtils());
-        
-        for (Iterator it = model.getValidators().iterator(); it.hasNext();)
-        {
-            ValidatorMeta validator = (ValidatorMeta) it.next();
-            
-            if (validator.getTagClass() != null)
-            {
-                File f = new File(mainSourceDirectory, StringUtils.replace(
-                    validator.getTagClass(), ".", "/")+".java");
-                
-                if (!f.exists() && canGenerateValidatorTag(validator))
-                {
-                    if (mainSourceDirectory2 != null)
-                    {
-                        File f2 = new File(mainSourceDirectory2, StringUtils.replace(
-                                validator.getTagClass(), ".", "/")+".java");
-                        if (f2.exists())
-                        {
-                            //Skip
-                            continue;
-                        }
-                    }
-                    log.info("Generating tag class:"+validator.getTagClass());
-                    try
-                    {
-                        _generateValidator(velocityEngine, validator,baseContext);
-                    }
-                    catch(MojoExecutionException e)
-                    {
-                        if (force)
-                        {
-                            log.severe(e.getMessage());
-                        }
-                        else
-                        {
-                            //Stop execution throwing exception
-                            throw e;
-                        }
-                    }
-                }
-            }
-        }
-        //throw new MojoExecutionException("stopping..");
-    }
-    
-    public boolean canGenerateValidatorTag(ValidatorMeta component)
-    {
-        if ( modelIds.contains(component.getModelId())
-                && includePackage(component)
-                && includeId(component))
-        {
-            return true;
-        }
-        else
-        {
-            return false;
-        }
-    }
-    
-    public boolean includePackage(ValidatorMeta validator)
-    {
-        if (packageContains != null)
-        {
-            if (MyfacesUtils.getPackageFromFullClass(validator.getTagClass()).startsWith(packageContains))
-            {
-                return true;
-            }
-            else
-            {
-                return false;
-            }
-        }
-        else
-        {
-            return true;
-        }        
-    }
-
-    public boolean includeId(ValidatorMeta validator)
-    {
-        if (typePrefix != null)
-        {
-            if (validator.getValidatorId().startsWith(typePrefix))
-            {
-                return true;
-            }
-            else
-            {
-                return false;
-            }
-        }
-        else
-        {
-            return true;
-        }        
-    }
-
-
-    /**
-     * Generates a parsed component.
-     * 
-     * @param validator
-     *            the parsed component metadata
-     */
-    private void _generateValidator(VelocityEngine velocityEngine, ValidatorMeta validator, VelocityContext baseContext)
-            throws MojoExecutionException
-    {
-
-        Context context = new VelocityContext(baseContext);
-        context.put("validator", validator);
-
-        Writer writer = null;
-        File outFile = null;
-
-        try
-        {
-            outFile = new File(generatedSourceDirectory, StringUtils.replace(
-                    validator.getTagClass(), ".", "/")+".java");
-
-            if ( !outFile.getParentFile().exists() )
-            {
-                outFile.getParentFile().mkdirs();
-            }
-
-            writer = new OutputStreamWriter(new FileOutputStream(outFile));
-
-            Template template = velocityEngine.getTemplate(_getTemplateTagName());
-                        
-            template.merge(context, writer);
-
-            writer.flush();
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException(
-                    "Error merging velocity templates: " + e.getMessage(), e);
-        }
-        finally
-        {
-            IOUtil.close(writer);
-            writer = null;
-        }
-    }
-    
-    private String _getTemplateTagName()
-    {
-        if (templateTagName == null)
-        {
-            if (_is12())
-            {
-                return "tagValidatorClass12.vm";
-            }
-            else
-            {
-                return "tagValidatorClass11.vm";
-            }
-        }
-        else
-        {
-            return templateTagName;
-        }
-    }
-
-    private boolean _is12()
-    {
-        return "1.2".equals(jsfVersion) || "12".equals(jsfVersion);
-    }
-
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeValidatorsMojo.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeValidatorsMojo.java
deleted file mode 100644
index ab12725..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeValidatorsMojo.java
+++ /dev/null
@@ -1,440 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-import java.util.logging.Logger;
-
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ValidatorMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.utils.BuildException;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.utils.MyfacesUtils;
-import org.apache.velocity.Template;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.app.VelocityEngine;
-import org.apache.velocity.context.Context;
-import org.apache.velocity.runtime.RuntimeConstants;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.StringUtils;
-
-import com.thoughtworks.qdox.JavaDocBuilder;
-
-/**
- * Maven goal to generate java source code for Validator classes.
- * 
- * <p>It uses velocity to generate templates, and has the option to define custom templates.</p>
- * <p>The executed template has the following variables available to it:</p>
- * <ul>
- *  <li>utils : Returns an instance of 
- *  org.apache.myfaces.buildtools.maven2.plugin.builder.utils.MyfacesUtils, 
- *  it contains some useful methods.</li>
- *  <li>validator : Returns the current instance of
- *   org.apache.myfaces.buildtools.maven2.plugin.builder.model.ValidatorMeta</li>
- * </ul>
- * 
- * @version $Id$
- * @requiresDependencyResolution compile
- * @goal make-validators
- * @phase generate-sources
- */
-public class MakeValidatorsMojo extends AbstractMojo
-{
-    final Logger log = Logger.getLogger(MakeValidatorsMojo.class.getName());
-
-    /**
-     * Injected Maven project.
-     * 
-     * @parameter expression="${project}"
-     * @readonly
-     */
-    private MavenProject project;
-
-    /**
-     * Defines the directory where the metadata file (META-INF/myfaces-metadata.xml) is loaded.
-     * 
-     * @parameter expression="${project.build.directory}/myfaces-builder-plugin/main/resources"
-     * @readonly
-     */
-    private File buildDirectory;
-
-    /**
-     * Injected name of file generated by earlier run of BuildMetaDataMojo goal.
-     * 
-     * @parameter
-     */
-    private String metadataFile = "META-INF/myfaces-metadata.xml";
-
-    /**
-     * The directory used to load templates into velocity environment.
-     * 
-     * @parameter expression="src/main/resources/META-INF"
-     */
-    private File templateSourceDirectory;
-
-    /**
-     * The directory where all generated files are created. This directory is added as a
-     * compile source root automatically like src/main/java is. 
-     * 
-     * @parameter expression="${project.build.directory}/myfaces-builder-plugin/main/java"
-     */
-    private File generatedSourceDirectory;
-
-    /**
-     * Only generate tag classes that contains that package prefix
-     * 
-     * @parameter
-     */
-    private String packageContains;
-
-    /**
-     *  Log and continue execution when generating validator classes.
-     *  <p>
-     *  If this property is set to false (default), errors when a validator class is generated stops
-     *  execution immediately.
-     *  </p>
-     * 
-     * @parameter
-     */
-    private boolean force;
-
-    /**
-     * Defines the jsf version (1.1 or 1.2), used to take the default templates for each version.
-     * <p> 
-     * If version is 1.1, the default templateValidatorName is 'validatorClass11.vm' and if version
-     * is 1.2 the default templateValidatorName is 'validatorClass12.vm'.
-     * </p>
-     * 
-     * @parameter
-     */
-    private String jsfVersion;
-    
-    /**
-     * Define the models that should be included when generate validator classes. If not set, the
-     * current model identified by the artifactId is used.
-     * <p>
-     * Each model built by build-metadata goal has a modelId, that by default is the artifactId of
-     * the project. Setting this property defines which objects tied in a specified modelId should
-     * be taken into account.  
-     * </p>
-     * <p>In this case, limit converter tag generation only to the components defined in the models 
-     * identified by the modelId defined. </p>
-     * <p>This is useful when you need to generate files that take information defined on other
-     * projects.</p>
-     * <p>Example:</p>
-     * <pre>
-     *    &lt;modelIds&gt;
-     *        &lt;modelId>model1&lt;/modelId&gt;
-     *        &lt;modelId>model2&lt;/modelId&gt;
-     *    &lt;/modelIds&gt;
-     * </pre>
-     * 
-     * @parameter
-     */
-    private List modelIds;
-
-    /**
-     * The name of the template used to generate validator classes. According to the value on 
-     * jsfVersion property the default if this property is not set could be validatorClass11.vm (1.1) or
-     * validatorClass12.vm (1.2)
-     * 
-     * @parameter 
-     */
-    private String templateValidatorName;
-    
-    /**
-     * This param is used to search in this folder if some file to
-     * be generated exists and avoid generation and duplicate exception.
-     * 
-     * @parameter expression="src/main/java"
-     */    
-    private File mainSourceDirectory;
-    
-    /**
-     * This param is used to search in this folder if some file to
-     * be generated exists and avoid generation and duplicate exception.
-     * 
-     * @parameter
-     */        
-    private File mainSourceDirectory2;
-
-    /**
-     * Execute the Mojo.
-     */
-    public void execute() throws MojoExecutionException
-    {
-        // This command makes Maven compile the generated source:
-        // getProject().addCompileSourceRoot( absoluteGeneratedPath.getPath() );
-        
-        try
-        {
-            project.addCompileSourceRoot( generatedSourceDirectory.getCanonicalPath() );
-            
-            if (modelIds == null)
-            {
-                modelIds = new ArrayList();
-                modelIds.add(project.getArtifactId());
-            }
-            Model model = IOUtils.loadModel(new File(buildDirectory,
-                    metadataFile));
-            new Flattener(model).flatten();
-            generateValidators(model);
-        }
-        catch (IOException e)
-        {
-            throw new MojoExecutionException("Error generating validators", e);
-        }
-        catch (BuildException e)
-        {
-            throw new MojoExecutionException("Error generating validators", e);
-        }
-    }
-    
-    
-    private VelocityEngine initVelocity() throws MojoExecutionException
-    {
-
-        Properties p = new Properties();
-
-        p.setProperty( "resource.loader", "file, class" );
-        p.setProperty( "file.resource.loader.class",
-                "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
-        p.setProperty( "file.resource.loader.path", templateSourceDirectory.getPath());
-        p.setProperty( "class.resource.loader.class",
-                "org.apache.myfaces.buildtools.maven2.plugin.builder.utils.RelativeClasspathResourceLoader" );
-        p.setProperty( "class.resource.loader.path", "META-INF");            
-        p.setProperty( "velocimacro.library", "validatorClassMacros11.vm");
-        p.setProperty( "velocimacro.permissions.allow.inline","true");
-        p.setProperty( "velocimacro.permissions.allow.inline.local.scope", "true");
-        p.setProperty( "directive.foreach.counter.initial.value","0");
-        p.setProperty( RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
-        "org.apache.myfaces.buildtools.maven2.plugin.builder.utils.ConsoleLogSystem" );
-        
-        File template = new File(templateSourceDirectory, _getTemplateName());
-        
-        if (template.exists())
-        {
-            log.info("Using template from file loader: "+template.getPath());
-        }
-        else
-        {
-            log.info("Using template from class loader: META-INF/"+_getTemplateName());
-        }
-                
-        VelocityEngine velocityEngine = new VelocityEngine();
-                
-        try
-        {
-            velocityEngine.init(p);
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException("Error creating VelocityEngine", e);
-        }
-        
-        return velocityEngine;
-    }
-    
-
-    /**
-     * Generates parsed validators.
-     */
-    private void generateValidators(Model model) throws IOException,
-            MojoExecutionException
-    {
-        // Make sure generated source directory 
-        // is added to compilation source path 
-        //project.addCompileSourceRoot(generatedSourceDirectory.getCanonicalPath());
-        
-        //Init Qdox for extract code 
-        JavaDocBuilder builder = new JavaDocBuilder();
-        
-        List sourceDirs = project.getCompileSourceRoots();
-        
-        // need a File object representing the original source tree
-        for (Iterator i = sourceDirs.iterator(); i.hasNext();)
-        {
-            String srcDir = (String) i.next();
-            builder.addSourceTree(new File(srcDir));
-        }        
-        
-        //Init velocity
-        VelocityEngine velocityEngine = initVelocity();
-
-        VelocityContext baseContext = new VelocityContext();
-        baseContext.put("utils", new MyfacesUtils());
-        
-        for (Iterator it = model.getValidators().iterator(); it.hasNext();)
-        {
-            ValidatorMeta validator = (ValidatorMeta) it.next();
-            
-            if (validator.getClassName() != null)
-            {
-                File f = new File(mainSourceDirectory, StringUtils.replace(
-                    validator.getClassName(), ".", "/")+".java");
-                                
-                if (!f.exists() && canGenerateValidator(validator))
-                {
-                    if (mainSourceDirectory2 != null)
-                    {
-                        File f2 = new File(mainSourceDirectory2, StringUtils.replace(
-                                validator.getClassName(), ".", "/")+".java");
-                        if (f2.exists())
-                        {
-                            //Skip
-                            continue;
-                        }
-                    }
-                    log.info("Generating validator class:"+validator.getClassName());
-                    try
-                    {
-                        _generateValidator(velocityEngine, builder,validator,baseContext);
-                    }
-                    catch(MojoExecutionException e)
-                    {
-                        if (force)
-                        {
-                            log.severe(e.getMessage());
-                        }
-                        else
-                        {
-                            //Stop execution throwing exception
-                            throw e;
-                        }
-                    }
-                }
-            }
-        }        
-    }
-    
-    public boolean canGenerateValidator(ValidatorMeta validator)
-    {
-        if ( modelIds.contains(validator.getModelId())
-                && includePackage(validator))
-        {
-            return true;
-        }
-        else
-        {
-            return false;
-        }
-    }
-    
-    public boolean includePackage(ValidatorMeta validator)
-    {
-        if (packageContains != null)
-        {
-            if (MyfacesUtils.getPackageFromFullClass(validator.getClassName()).startsWith(packageContains))
-            {
-                return true;
-            }
-            else
-            {
-                return false;
-            }
-        }
-        else
-        {
-            return true;
-        }        
-    }
-    
-    
-    /**
-     * Generates a parsed validator.
-     * 
-     * @param validator
-     *            the parsed validator metadata
-     */
-    private void _generateValidator(VelocityEngine velocityEngine,
-            JavaDocBuilder builder,
-            ValidatorMeta validator, VelocityContext baseContext)
-            throws MojoExecutionException
-    {
-        Context context = new VelocityContext(baseContext);
-        context.put("validator", validator);
-        
-        Writer writer = null;
-        File outFile = null;
-
-        try
-        {
-            outFile = new File(generatedSourceDirectory, StringUtils.replace(
-                    validator.getClassName(), ".", "/")+".java");
-
-            if ( !outFile.getParentFile().exists() )
-            {
-                outFile.getParentFile().mkdirs();
-            }
-
-            writer = new OutputStreamWriter(new FileOutputStream(outFile));
-
-            Template template = velocityEngine.getTemplate(_getTemplateName());
-                        
-            template.merge(context, writer);
-
-            writer.flush();
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException(
-                    "Error merging velocity templates: " + e.getMessage(), e);
-        }
-        finally
-        {
-            IOUtil.close(writer);
-            writer = null;
-        }
-    }
-                
-    private String _getTemplateName()
-    {
-        if (templateValidatorName == null)
-        {
-            if (_is12())
-            {
-                return "validatorClass12.vm";
-            }
-            else
-            {
-                return "validatorClass11.vm";
-            }
-        }
-        else
-        {
-            return templateValidatorName;
-        }
-    }
-    
-    private boolean _is12()
-    {
-        return "1.2".equals(jsfVersion) || "12".equals(jsfVersion);
-    }
-
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/ModelBuilder.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/ModelBuilder.java
deleted file mode 100644
index 74a81db..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/ModelBuilder.java
+++ /dev/null
@@ -1,61 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder;
-
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-
-/**
- * An interface that is implemented by classes that are capable of collecting
- * metadata about JSF components, converters, validators, etc.
- * <p>
- * A ModelBuilder implementation might read xml files, or scan source code for
- * annotations, or read data from a database, or any number of possible
- * approaches. All that matters is that it makes a series of calls to a Model
- * object to add information.
- * <p>
- * ModelBuilder implementations may be run as a chain, ie one instance used to
- * populate the Model object with some objects, then a second instance used to
- * add more data or modify the data already in the model.
- */
-public interface ModelBuilder
-{
-    /**
-     * Given a model (which might already be partly populated with data, add
-     * information about JSF artifacts.
-     */
-    public void buildModel(Model model, MavenProject project)
-            throws MojoExecutionException;
-
-    /**
-     * Given a model (which might already be partly populated with data, add
-     * information about JSF artifacts, indicating include and exclude
-     * rules
-     * 
-     * @since 1.0.2
-     * @param model the model to add the information
-     * @param project the maven project to analyze
-     * @param includes rules to include files
-     * @param excludes rules to exclude files
-     * @throws MojoExecutionException
-     */
-    public void buildModel(Model model, MavenProject project, String includes, String excludes)
-            throws MojoExecutionException;    
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/io/PrettyWriter.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/io/PrettyWriter.java
deleted file mode 100644
index 08111fb..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/io/PrettyWriter.java
+++ /dev/null
@@ -1,178 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.io;
-
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.Writer;
-
-public class PrettyWriter extends PrintWriter
-{
-    public PrettyWriter(OutputStream out)
-    {
-        super(out);
-    }
-
-    public PrettyWriter(OutputStream out, boolean autoFlush)
-    {
-        super(out, autoFlush);
-    }
-
-    public PrettyWriter(Writer out)
-    {
-        super(out);
-    }
-
-    public PrettyWriter(Writer out, boolean autoFlush)
-    {
-        super(out, autoFlush);
-    }
-
-    public void indent()
-    {
-        _indentation++;
-    }
-
-    public void unindent()
-    {
-        _indentation--;
-    }
-
-    public void write(String string, int offset, int length)
-    {
-        if (_unlatchPending())
-        {
-            for (int i = 0; i < _indentation; i++)
-            {
-                super.write(TAB_INDENT, 0, 2);
-            }
-        }
-
-        super.write(string, offset, length);
-    }
-
-    public void write(char[] chars, int offset, int length)
-    {
-        if (_unlatchPending())
-        {
-            for (int i = 0; i < _indentation; i++)
-            {
-                super.write(TAB_INDENT_CHARS, 0, 2);
-            }
-        }
-
-        super.write(chars, offset, length);
-    }
-
-    public void println()
-    {
-        super.println();
-        _latchPending();
-    }
-
-    public void println(boolean x)
-    {
-        super.println(x);
-        _latchPending();
-    }
-
-    public void println(char x)
-    {
-        super.println(x);
-        _latchPending();
-    }
-
-    public void println(int x)
-    {
-        super.println(x);
-        _latchPending();
-    }
-
-    public void println(long x)
-    {
-        super.println(x);
-        _latchPending();
-    }
-
-    public void println(float x)
-    {
-        super.println(x);
-        _latchPending();
-    }
-
-    public void println(double x)
-    {
-        super.println(x);
-        _latchPending();
-    }
-
-    public void println(char[] x)
-    {
-        super.println(x);
-        _latchPending();
-    }
-
-    public void println(String x)
-    {
-        int fromIndex = 0;
-        for (int index = x.indexOf('\n'); index != -1 && index + 1 < x.length(); fromIndex = index + 1, index = x
-                .indexOf('\n', fromIndex))
-        {
-            super.println(x.substring(fromIndex, index));
-            _latchPending();
-        }
-
-        super.println(x.substring(fromIndex));
-        _latchPending();
-    }
-
-    public void println(Object x)
-    {
-        super.println(x);
-        _latchPending();
-    }
-
-    private boolean _unlatchPending()
-    {
-        boolean pending = _pending;
-        if (pending)
-        {
-            _pending = false;
-        }
-
-        return pending;
-    }
-
-    private boolean _latchPending()
-    {
-        boolean pending = _pending;
-        if (!pending)
-        {
-            _pending = true;
-        }
-
-        return !pending;
-    }
-
-    private int _indentation;
-    private boolean _pending = true;
-
-    private static final String TAB_INDENT = "  ";
-    private static final char[] TAB_INDENT_CHARS = TAB_INDENT.toCharArray();
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/io/XmlWriter.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/io/XmlWriter.java
deleted file mode 100644
index f6abf67..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/io/XmlWriter.java
+++ /dev/null
@@ -1,219 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.io;
-
-import java.io.PrintWriter;
-import java.util.Stack;
-
-/**
- * Simple utility to help write out data structures in xml format, with pretty
- * indenting.
- */
-public class XmlWriter
-{
-    private static final String XML_CHARS = "<>&";
-
-    private PrintWriter out;
-    private Stack contexts = new Stack();
-    private int indent = 0;
-
-    // Is the current xml element still "open" for adding attributes,
-    // ie needs a ">" before adding nested text or child elements.
-    private boolean openElement = false;
-
-    private static class Context
-    {
-        String elementName;
-        boolean hasContent;
-
-        Context(String element)
-        {
-            elementName = element;
-        }
-    }
-
-    public XmlWriter(PrintWriter out)
-    {
-        this.out = out;
-    }
-
-    private void indent()
-    {
-        out.write("\n");
-        for (int i = 0; i < indent; ++i)
-        {
-            out.write("  ");
-        }
-    }
-
-    private void indentInc()
-    {
-        indent();
-        ++indent;
-    }
-
-    private void indentDec()
-    {
-        --indent;
-        indent();
-    }
-
-    private boolean containsXmlChars(String text)
-    {
-        for (int i = 0; i < XML_CHARS.length(); ++i)
-        {
-            if (text.indexOf(XML_CHARS.charAt(i)) >= 0)
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public void writeElement(String name, String body)
-    {
-        if (body == null)
-        {
-            return;
-        }
-
-        if (openElement)
-        {
-            out.write(">");
-            openElement = false;
-        }
-
-        indent();
-        out.write("<");
-        out.write(name);
-        out.write(">");
-
-        if (containsXmlChars(body))
-        {
-            // The text contains chars that need to be escaped. Rather than
-            // escape them one-by-one, just write the body in a CDATA section.
-
-            if (body.indexOf("\n") > 0)
-            {
-                // multi-line body, so it is most readable when the CDATA
-                // markers are against the left-hand margin
-                out.write("\n<![CDATA[\n");
-                out.write(body);
-                out.write("\n]]>");
-
-                // Write the end tag on the next line, correctly indented
-                indent();
-            }
-            else
-            {
-                // just a small body, so output it "inline"
-                out.write("<![CDATA[");
-                out.write(body);
-                out.write("]]>");
-            }
-        }
-        else
-        {
-            out.write(body);
-        }
-        out.write("</");
-        out.write(name);
-        out.write(">");
-
-        ((Context) contexts.peek()).hasContent = true;
-    }
-
-    public void writeElement(String name, boolean value)
-    {
-        writeElement(name, String.valueOf(value));
-    }
-
-    public void writeElement(String name, Boolean value)
-    {
-        if (value != null)
-        {
-            writeElement(name, value.toString());
-        }
-    }
-
-    public void beginElement(String name)
-    {
-        if (openElement)
-        {
-            out.write(">");
-        }
-        openElement = true;
-
-        indentInc();
-        out.write("<");
-        out.write(name);
-
-        if (!contexts.empty())
-        {
-            ((Context) contexts.peek()).hasContent = true;
-        }
-        contexts.push(new Context(name));
-
-    }
-
-    public void writeAttr(String name, String value)
-    {
-        if (value == null)
-        {
-            return;
-        }
-
-        if (!openElement)
-        {
-            throw new IllegalStateException("xml element not open");
-        }
-        out.write(" ");
-        out.write(name);
-        out.write("=");
-        out.write("\"");
-        out.write(value);
-        out.write("\"");
-    }
-
-    public void endElement(String name)
-    {
-        Context c = (Context) contexts.pop();
-
-        if (!c.elementName.equals(name))
-        {
-            throw new IllegalStateException("Unbalanced xml: expected to end ["
-                    + c.elementName + "]" + " but [" + name
-                    + "] was ended instead");
-        }
-
-        if (c.hasContent)
-        {
-            indentDec();
-            out.write("</");
-            out.write(c.elementName);
-            out.write(">");
-        }
-        else
-        {
-            out.write("/>");
-            --indent; // decrement the indent, but do not write the linefeed
-        }
-        openElement = false;
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/AttributeHolder.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/AttributeHolder.java
deleted file mode 100644
index 5aee42c..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/AttributeHolder.java
+++ /dev/null
@@ -1,34 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import java.util.Iterator;
-
-/**
- * Interface for any artifact that has JSP attributes on it.
- */
-public interface AttributeHolder
-{
-    
-    Iterator attributes();
-
-    AttributeMeta getAttribute(String name);
-
-    void addAttribute(AttributeMeta prop);
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/AttributeMeta.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/AttributeMeta.java
deleted file mode 100644
index e39a527..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/AttributeMeta.java
+++ /dev/null
@@ -1,256 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import org.apache.commons.digester.Digester;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.io.XmlWriter;
-
-/**
- * Store metadata about a attribute of a jsp tag. 
- * <p>
- * This metadata defines the attributes of JSP tags, among other things.
- * 
- * Since this is a different concept from PropertyMeta, is is left as
- * another class (Maybe PropertyMeta must AttributeMeta but I'm not sure, since
- * there are different concepts (a property is for jsf, an attribute is for jsp)).
- */
-public class AttributeMeta
-{
-    private String _name;
-    private String _className;
-    private Boolean _required;
-    private String _description;
-    private String _longDescription;
-    private Boolean _rtexprvalue;
-    private String _deferredValueType;
-    private String _deferredMethodSignature;
-    private Boolean _exclude;
-
-    public AttributeMeta()
-    {
-        
-    }
-    
-    /**
-     * Write this model out as xml.
-     */
-    public static void writeXml(XmlWriter out, AttributeMeta am)
-    {
-        out.beginElement("attribute");
-        out.writeElement("name", am._name);
-        out.writeElement("className", am._className);
-        out.writeElement("required", am._required);
-        out.writeElement("rtexprvalue", am._rtexprvalue);
-        out.writeElement("desc", am._description);
-        out.writeElement("longDesc", am._longDescription);
-        out.writeElement("deferredValueType", am._deferredValueType);
-        out.writeElement("deferredMethodSignature", am._deferredMethodSignature);
-        out.writeElement("exclude", am._exclude);
-        out.endElement("attribute");
-    }
-
-    /**
-     * Add digester rules to repopulate a Model instance from an xml file.
-     */
-    public static void addXmlRules(Digester digester, String prefix)
-    {
-        String newPrefix = prefix + "/attribute";
-
-        digester.addObjectCreate(newPrefix, AttributeMeta.class);
-        digester.addSetNext(newPrefix, "addAttribute");
-
-        digester.addBeanPropertySetter(newPrefix + "/name");
-        digester.addBeanPropertySetter(newPrefix + "/className");
-        digester.addBeanPropertySetter(newPrefix + "/required");
-        digester.addBeanPropertySetter(newPrefix + "/rtexprvalue");
-        digester.addBeanPropertySetter(newPrefix + "/desc", "description");
-        digester.addBeanPropertySetter(newPrefix + "/longDesc",
-                "longDescription");
-        digester.addBeanPropertySetter(newPrefix + "/deferredValueType");
-        digester.addBeanPropertySetter(newPrefix + "/deferredMethodSignature");
-        digester.addBeanPropertySetter(newPrefix + "/exclude");        
-    }
-
-    /**
-     * Merge the data in the specified other property into this one, throwing an
-     * exception if there is an incompatibility.
-     */
-    public void merge(AttributeMeta other)
-    {
-        // don't merge className
-        
-        _name = ModelUtils.merge(this._name, other._name);
-        _required = ModelUtils.merge(this._required, other._required);
-        _rtexprvalue = ModelUtils.merge(this._rtexprvalue, other._rtexprvalue);
-        _description = ModelUtils.merge(this._description, other._description);
-        _longDescription = ModelUtils.merge(this._longDescription, other._longDescription);
-        _deferredValueType = ModelUtils.merge(this._deferredValueType, other._deferredValueType);
-        _deferredMethodSignature = ModelUtils.merge(this._deferredMethodSignature, other._deferredMethodSignature);
-        _exclude = ModelUtils.merge(this._exclude, other._exclude);        
-    }
-    
-    /**
-     * Copy all attributes in other to this instance.
-     * 
-     * @since 1.0.3
-     * @param other
-     */
-    public void copy(AttributeMeta other)
-    {
-        _name = other._name;
-        _required = other._required;
-        _rtexprvalue = other._rtexprvalue;
-        _description = other._description;
-        _longDescription = other._longDescription;
-        _deferredValueType = other._deferredValueType;
-        _deferredMethodSignature = other._deferredMethodSignature;
-        _exclude = other._exclude;
-    }
-    
-    /**
-     * Set the name that users refer to this property by.
-     * <p>
-     * This sets the name of xml tag attributes, and the base names of generated
-     * getter/setter methods.
-     */
-    public void setName(String name)
-    {
-        _name = name;
-    }
-
-    public String getName()
-    {
-        return _name;
-    }
-
-    /**
-     * Set the fully-qualified name of the type of this property.
-     */
-    public void setClassName(String className)
-    {
-        this._className = className;
-    }
-
-    public String getClassName()
-    {
-        return _className;
-    }
-    
-    /**
-     * Specify whether this property is required, ie whether it is a syntax
-     * error for someone to use a tag for a component with this property but not
-     * explicitly provide a value for this property.
-     */
-    public void setRequired(Boolean required)
-    {
-        _required = required;
-    }
-
-    public Boolean isRequired()
-    {
-        return ModelUtils.defaultOf(_required, false);
-    }
-    
-    public void setRtexprvalue(Boolean rtexprvalue)
-    {
-        _rtexprvalue = rtexprvalue;
-    }
-
-    public Boolean isRtexprvalue()
-    {
-        return ModelUtils.defaultOf(_rtexprvalue, false);
-    }
-    
-    
-    public void setDescription(String desc)
-    {
-        _description = desc;
-    }
-
-    public String getDescription()
-    {
-        return _description;
-    }
-
-    public void setLongDescription(String desc)
-    {
-        _longDescription = desc;
-    }
-
-    public String getLongDescription()
-    {
-        return _longDescription;
-    }
-
-    /**
-     * @since 1.0.3
-     */
-    public void setDeferredValueType(String deferredValueType)
-    {
-        _deferredValueType = deferredValueType;
-    }
-    
-    /**
-     * Indicate the type that values should be
-     * cast on tld. It is supposed that the className is
-     * javax.el.ValueExpression to apply it. 
-     *
-     * @since 1.0.3
-     */
-    public String getDeferredValueType()
-    {
-        return _deferredValueType;
-    }
-
-    /**
-     * @since 1.0.3
-     */
-    public void setDeferredMethodSignature(String deferredMethodSignature)
-    {
-        _deferredMethodSignature = deferredMethodSignature;
-    }
-
-    /**
-     * Indicate the method signature that values should be
-     * cast on tld. It is supposed that the className is
-     * javax.el.MethodExpression to apply it. 
-     *
-     * @since 1.0.3
-     */
-    public String getDeferredMethodSignature()
-    {
-        return _deferredMethodSignature;
-    }
-    
-    /**
-     * @since 1.0.3
-     */
-    public Boolean isExclude()
-    {
-        return ModelUtils.defaultOf(_exclude, false);
-    }
-    
-    /**
-     * @since 1.0.3
-     */
-    public void setExclude(Boolean exclude)
-    {
-        _exclude = exclude;
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ClassMeta.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ClassMeta.java
deleted file mode 100644
index 1d42db6..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ClassMeta.java
+++ /dev/null
@@ -1,316 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.commons.digester.Digester;
-import org.apache.commons.lang.StringUtils;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.io.XmlWriter;
-
-/**
- * Base class for various metadata (model) classes.
- * <p>
- * This holds metadata common to all model classes that represent a JSF entity,
- * eg a component, converter, validator, renderer. In all these cases, the class has a
- * type, a parent and optionally a list of implemented interfaces.
- * <p>
- * Instances of this type are intended primarily to map to entries in generated
- * JSP TLD files, faces-config.xml files and similar. The "class" attribute on
- * this class contains the name of the java class that implements that entity.
- * <p>
- * However there are also instances of this class that represent "abstract"
- * entities that are not directly referenced by TLD or faces-config files; they
- * exist to represent ancestor classes of the concrete entities. 
- * <p>
- * The instances are created via annotations on Java classes. Therefore each
- * ClassMeta has a "sourceClass" property that records the name of the annotated
- * class. In simple cases, "class" and "sourceClass" are the same, ie the JSF entity
- * <i>is</i> the class that holds the relevant annotations. But this is not true in
- * the case of "code generation"; here the class property references the actual JSF
- * entity (the generated class).
- * <p>
- * As described in the documentation for the parent attribute, the ClassMeta objects
- * describe a java inheritance tree, but it is not quite the same as the real java
- * inheritance hierarchy for the annotated java classes. The ClassMeta data omits
- * any classes in the hierarchy that are not annotated, as they are not relevant
- * for the purposes of metadata inheritance.
- */
-public class ClassMeta
-{
-    private String _xmlElementName;
-
-    private String _className;
-    private String _parentClassName;
-    
-    private List _interfaceClassNames = new ArrayList();
-    private String _modelId;
-    private String _sourceClassName;
-    private String _sourceClassParentClassName;
-
-    /**
-     * Add digester rules to repopulate an instance of this type from an xml
-     * file.
-     */
-    public static void addXmlRules(Digester digester, String prefix)
-    {
-        digester.addBeanPropertySetter(prefix + "/modelId");
-        digester.addBeanPropertySetter(prefix + "/className");
-        digester.addBeanPropertySetter(prefix + "/parentClassName");
-        digester.addBeanPropertySetter(prefix + "/sourceClassName");
-        digester.addBeanPropertySetter(prefix + "/sourceClassParentClassName");
-        digester.addCallMethod(prefix + "/interfaces/interface",
-                "addInterfaceClassName", 1);
-        digester.addCallParam(prefix + "/interfaces/interface", 0, "name");
-    }
-
-    /**
-     * Constructor.
-     * 
-     * Param xmlElementName is the name of the xml element that is created
-     * when method writeXml is invoked.
-     */
-    protected ClassMeta(String xmlElementName)
-    {
-        _xmlElementName = xmlElementName;
-    }
-
-    /**
-     * Write the properties of this instance out as xml.
-     * <p>
-     * The name of the xml element that is created to hold the properties
-     * was specified when the constructor was called.
-     * <p>
-     * Subclasses that want to output their own properties should not
-     * override this method. Instead, they should override writeXmlSimple
-     * (and in rare cases writeXmlComplex).
-     * <p>
-     * Having two write methods (writeXmlSimple/writeXmlComplex) gives some basic
-     * control over the order in which data is written to xml, in order to make
-     * the generated xml look nice. Any properties written in writeXmlSimple will
-     * appear in the output file before properties written by writeXmlComplex. 
-     * Therefore, properties which are "easily read" should be written out in
-     * a writeXmlSimple method. Data which has large CDATA blocks, or complicated
-     * nested structure should be written out in a writeXmlComplex method so that
-     * the "simple" stuff can be easily read and is not buried in the middle of
-     * the harder-to-read output.
-     */
-    protected void writeXml(XmlWriter out)
-    {
-        out.beginElement(_xmlElementName);
-        writeXmlSimple(out);
-        writeXmlComplex(out);
-        out.endElement(_xmlElementName);
-    }
-
-    /**
-     * Write this model out as xml.
-     * <p>
-     * Subclasses that wish to write out properties as xml should override
-     * this method, call the super implementation, then call methods on the
-     * XmlWriter object to output their data.
-     */
-    protected void writeXmlSimple(XmlWriter out)
-    {
-        out.writeElement("modelId", _modelId);
-        out.writeElement("className", _className);
-        out.writeElement("parentClassName", _parentClassName);
-        out.writeElement("sourceClassName", _sourceClassName);
-        out.writeElement("sourceClassParentClassName", _sourceClassParentClassName);
-
-        // Interface data is a little complex, and could possibly be placed in the
-        // writeXmlComplex method. But except for very complicated inheritance
-        // hierarchies is is still only going to be a few lines and it logically
-        // belongs with the className/parentClassName/etc data. So it is written here
-        // along with the other "simple" data.
-        if (!_interfaceClassNames.isEmpty())
-        {
-            out.beginElement("interfaces");
-            for (Iterator i = _interfaceClassNames.iterator(); i.hasNext();)
-            {
-                String name = (String) i.next();
-                out.beginElement("interface");
-                out.writeAttr("name", name);
-                out.endElement("interface");
-            }
-            out.endElement("interfaces");
-        }
-    }
-
-    /**
-     * See documentation for writeXml and writeXmlSimple methods.
-     */
-    protected void writeXmlComplex(XmlWriter out)
-    {
-        // no complex data to write for this class.
-    }
-
-    /**
-     * Merge any inheritable data from the specified "other" instance into
-     * the metadata held by this instance.
-     */
-    protected void merge(ClassMeta other)
-    {
-        // There is nothing to merge between two ClassMeta objects;
-        // none of the properties on this class are inheritable.
-    }
-
-    /**
-     * Indicates which "group" of metadata this class belongs to.
-     * <p>
-     * Projects can inherit metadata from other projects, in which case
-     * all the ClassMeta objects end up in one big collection. But for
-     * some purposes it is necessary to iterate over the objects belonging
-     * to only one project (eg when generating components). This return
-     * value can be tested to check which "group" (project) a particular
-     * instance belongs to.
-     */
-    public String getModelId()
-    {
-        return _modelId;
-    }
-
-    public void setModelId(String modelId)
-    {
-        this._modelId = modelId;
-    }
-
-    /**
-     * The fully-qualified name of the JSF entity class, ie the class that actually
-     * implements a Component, Converter, Validator, Renderer, etc.
-     * <p>
-     * The specified class may be a hand-written one, or one created via code generation. 
-     */
-    public String getClassName()
-    {
-        return _className;
-    }
-
-    public void setClassName(String className)
-    {
-        _className = className;
-    }
-
-    /**
-     * Utility method to return just the packagename part of the className
-     * attribute.
-     */
-    public String getPackageName()
-    {
-        return StringUtils.substring(getClassName(), 0, StringUtils.lastIndexOf(getClassName(), '.'));
-    }
-
-    /**
-     * The nearest relevant (annotated) ancestor class of the class that this metadata was
-     * extracted from.
-     * <p>
-     * For example, when a class is marked as a Component class, then this will
-     * refer to the nearest ancestor class that is also marked as a Component
-     * class. Note that this is "consistent with" the actual Java class hierarchy for 
-     * annotated classes that were used to create this data, but skips java classes
-     * that were not annotated (and are therefore irrelevant for metadata purposes).
-     * <p>
-     * The value of this attribute will match the className attribute of another ClassMeta
-     * object. Following the chain of ParentClassName links (plus Interface links) gives all
-     * the ClassMeta objects needed to determine the set of metadata properties for a JSF
-     * entity.    
-     */
-    public String getParentClassName()
-    {
-        return _parentClassName;
-    }
-
-    public void setParentClassName(String className)
-    {
-        _parentClassName = className;
-    }
-
-    /**
-     * The list of relevant interface classes.
-     * <p>
-     * For example, when a class is marked as a Component class, then this will
-     * refer to the list of interfaces which that class implements that are also
-     * marked as a component.
-     */
-    public List getInterfaceClassNames()
-    {
-        return _interfaceClassNames;
-    }
-
-    public void setInterfaceClassNames(List classNames)
-    {
-        _interfaceClassNames = classNames;
-    }
-
-    public void addInterfaceClassName(String name)
-    {
-        _interfaceClassNames.add(name);
-    }
-
-    /**
-     * Return the className of the real java class from which this metadata was gathered.
-     * <p>
-     * This is mostly used for documentation. However when generating code in "template mode",
-     * this is used to locate the original class in order to find the source code to copy.
-     * It is also used for some reason in MakeComponentsMojo when determining whether to
-     * generate a class or not - this is probably wrong.
-     */
-    public String getSourceClassName()
-    {
-        return _sourceClassName;
-    }
-
-    public void setSourceClassName(String sourceClassName)
-    {
-        this._sourceClassName = sourceClassName;
-    }
-
-    /**
-     * Return the real java parent class of the class from which this metadata
-     * was gathered (see classSource property).
-     * <p>
-     * This value is usually the same as property parentClassName. However if
-     * the parent of the annotated class is not itself annotated, then this
-     * property still points to the real java parent (which will not have a
-     * ClassMeta object representing it) while property parentClass will point
-     * to the nearest superclass that does have an annotation (and does have a
-     * corresponding ClassMeta object).
-     * <p>
-     * This information is needed for code generation.
-     */
-    public void setSourceClassParentClassName(String sourceClassParentClassName)
-    {
-        this._sourceClassParentClassName = sourceClassParentClassName;
-    }
-
-    public String getSourceClassParentClassName()
-    {
-        if (_sourceClassParentClassName == null)
-        {
-            //return the parent class name instead.
-            return getParentClassName();
-        }
-        else
-        {
-            return _sourceClassParentClassName;            
-        }        
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ComponentMeta.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ComponentMeta.java
deleted file mode 100644
index 737ec5f..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ComponentMeta.java
+++ /dev/null
@@ -1,473 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.digester.Digester;
-import org.apache.commons.lang.StringUtils;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.io.XmlWriter;
-
-/**
- * Store metadata about a JSF UIComponent, or some base
- * class or interface that a UIComponent can be derived from.
- */
-public class ComponentMeta extends ViewEntityMeta implements 
-    PropertyHolder, FacetHolder
-{
-    private String _bodyContent;
-
-    private String _type;
-    private String _family;
-    private String _rendererType;
-
-    private String _tagClass;
-    private String _tagHandler;
-    private String _tagSuperclass;
-    private Boolean _namingContainer;
-    private Boolean _children;
-    private Boolean _configExcluded;
-    private String _serialuid;
-    private String _implements;
-    private String _defaultEventName;
-    
-    private Boolean _generatedComponentClass;
-    private Boolean _generatedTagClass;
-    
-    private Boolean _template;
-    
-    protected Map _facets;
-
-    /**
-     * Write an instance of this class out as xml.
-     */
-    protected void writeXmlSimple(XmlWriter out)
-    {
-        super.writeXmlSimple(out);
-
-        out.writeElement("type", _type);
-        out.writeElement("bodyContent", _bodyContent);
-        out.writeElement("family", _family);
-        out.writeElement("tagClass", _tagClass);
-        out.writeElement("tagSuperclass", _tagSuperclass);
-        out.writeElement("tagHandler", _tagHandler);
-        out.writeElement("rendererType", _rendererType);
-        out.writeElement("configExcluded", _configExcluded);
-        out.writeElement("defaultEventName", _defaultEventName);
-
-        out.writeElement("serialuid", _serialuid);
-        out.writeElement("implements", _implements);
-        out.writeElement("generatedComponentClass", _generatedComponentClass);
-        out.writeElement("generatedTagClass", _generatedTagClass);
-        out.writeElement("template", _template);
-        
-        for (Iterator i = _facets.values().iterator(); i.hasNext();)
-        {
-            FacetMeta facet = (FacetMeta) i.next();
-            FacetMeta.writeXml(out, facet);
-        }
-    }
-
-    /**
-     * Add digester rules to repopulate an instance of this type from an xml
-     * file.
-     */
-    public static void addXmlRules(Digester digester, String prefix)
-    {
-        String newPrefix = prefix + "/component";
-
-        digester.addObjectCreate(newPrefix, ComponentMeta.class);
-        digester.addSetNext(newPrefix, "addComponent");
-
-        ViewEntityMeta.addXmlRules(digester, newPrefix);
-
-        digester.addBeanPropertySetter(newPrefix + "/type");
-        digester.addBeanPropertySetter(newPrefix + "/bodyContent");
-        digester.addBeanPropertySetter(newPrefix + "/family");
-        digester.addBeanPropertySetter(newPrefix + "/tagClass");
-        digester.addBeanPropertySetter(newPrefix + "/tagSuperclass");
-        digester.addBeanPropertySetter(newPrefix + "/tagHandler");
-        digester.addBeanPropertySetter(newPrefix + "/rendererType");
-        digester.addBeanPropertySetter(newPrefix + "/defaultEventName");
-        digester.addBeanPropertySetter(newPrefix + "/faceletRendererType");
-        digester.addBeanPropertySetter(newPrefix + "/configExcluded");
-        digester.addBeanPropertySetter(newPrefix + "/serialuid");
-        digester.addBeanPropertySetter(newPrefix + "/implements");
-        digester.addBeanPropertySetter(newPrefix + "/generatedComponentClass");
-        digester.addBeanPropertySetter(newPrefix + "/generatedTagClass");
-        digester.addBeanPropertySetter(newPrefix + "/template");
-        
-        FacetMeta.addXmlRules(digester, newPrefix);
-    }
-
-    /**
-     * Constructor.
-     */
-    public ComponentMeta()
-    {
-        super("component");
-        _facets = new LinkedHashMap();
-    }
-
-    /**
-     * Merge the data in the specified other property into this one, throwing an
-     * exception if there is an incompatibility.
-     */
-    public void merge(ComponentMeta other)
-    {
-        _bodyContent = ModelUtils.merge(this._bodyContent, other._bodyContent);
-
-        _type = ModelUtils.merge(this._type, other._type);
-        _family = ModelUtils.merge(this._family, other._family);
-        _rendererType = ModelUtils.merge(this._rendererType,
-                other._rendererType);
-        
-        boolean inheritParentTag = false;
-        //check if the parent set a tag class
-        if (other._tagClass != null)
-        {
-            //The tagSuperclass is the tagClass of the parent
-            _tagSuperclass = ModelUtils.merge(this._tagSuperclass,
-                    other._tagClass);
-            inheritParentTag = true;
-        }
-        else
-        {
-            //The tagSuperclass is the tagSuperclass of the parent
-            _tagSuperclass = ModelUtils.merge(this._tagSuperclass,
-                    other._tagSuperclass);            
-        }
-        //_tagClass = ModelUtils.merge(this._tagClass, other._tagClass);
-        _tagHandler = ModelUtils.merge(this._tagHandler, other._tagHandler);
-        _defaultEventName = ModelUtils.merge(this._defaultEventName, other._defaultEventName);
-        _namingContainer = ModelUtils.merge(this._namingContainer,
-                other._namingContainer);
-        _children = ModelUtils.merge(this._children, other._children);
-
-        ModelUtils.mergeProps(this, other);
-        ModelUtils.mergeFacets(this, other);
-        
-        if (inheritParentTag)
-        {
-            for (Iterator i = this.properties(); i.hasNext();)
-            {
-                PropertyMeta srcProp = (PropertyMeta) i.next();
-                PropertyMeta parentProp = other.getProperty(srcProp.getName());
-                if (parentProp != null)
-                {
-                    //There are three possible behaviors:
-                    //1. The property is defined on the child again and
-                    //   the property was already on the tag hierarchy, so
-                    //   inheritedTag must be set to TRUE.
-                    //2. The property is defined on the child again and
-                    //   it is necessary to write again on the generated
-                    //   tag, so the annotation looks like
-                    //   "@JSFProperty inheritedTag=false"
-                    //   This condition must remain as FALSE
-                    //3. The property is set by the user as true, but there
-                    //   was not defined previously on the hierarchy, so
-                    //   this condition must be as is (TRUE) 
-                    //   (skipped on parentProp != null).
-                    if (srcProp.isLocalInheritedTag() == null ||
-                            srcProp.isInheritedTag().booleanValue())
-                    {
-                        srcProp.setInheritedTag(Boolean.TRUE);
-                    }
-                }
-            }
-            _propertyTagList = null;
-        }
-    }
-
-    public void setBodyContent(String bodyContent)
-    {
-        this._bodyContent = bodyContent;
-    }
-
-    public String getBodyContent()
-    {
-        return _bodyContent;
-    }
-
-    /**
-     * Sets the JSF component type for this component.
-     */
-    public void setType(String componentType)
-    {
-        _type = componentType;
-    }
-
-    public String getType()
-    {
-        return _type;
-    }
-
-    /**
-     * Sets the JSF component family for this component.
-     */
-    public void setFamily(String componentFamily)
-    {
-        _family = componentFamily;
-    }
-
-    public String getFamily()
-    {
-        return _family;
-    }
-
-    /**
-     * Sets the renderer type for this component.
-     */
-    public void setRendererType(String rendererType)
-    {
-        _rendererType = rendererType;
-    }
-
-    public String getRendererType()
-    {
-        return _rendererType;
-    }
-
-    /**
-     * Sets the JSP tag handler class for this component.
-     */
-    public void setTagClass(String tagClass)
-    {
-        _tagClass = tagClass;
-    }
-
-    public String getTagClass()
-    {
-        return _tagClass;
-    }
-
-    /**
-     * Sets the JSP tag handler superclass for this component.
-     */
-    public void setTagSuperclass(String tagSuperclass)
-    {
-        _tagSuperclass = tagSuperclass;
-    }
-
-    public String getTagSuperclass()
-    {
-        return _tagSuperclass;
-    }
-
-    /**
-     * Specifies the class of the Facelets tag handler (component handler) for
-     * this component.
-     * <p>
-     * Note that a Facelets tag handler class is not needed for most components.
-     */
-    public void setTagHandler(String tagHandler)
-    {
-        _tagHandler = tagHandler;
-    }
-
-    public String getTagHandler()
-    {
-        return _tagHandler;
-    }
-
-    /**
-     * Specifies whether this component is a "naming container", ie whether it
-     * adds its own clientId as a prefix onto the clientId of its child
-     * components.
-     */
-    public void setNamingContainer(Boolean namingContainer)
-    {
-        _namingContainer = namingContainer;
-    }
-
-    public Boolean getNamingContainer()
-    {
-        return ModelUtils.defaultOf(_namingContainer, false);
-    }
-
-    public void setConfigExcluded(Boolean configExcluded)
-    {
-        _configExcluded = configExcluded;
-    }
-
-    public Boolean isConfigExcluded()
-    {
-        return ModelUtils.defaultOf(_configExcluded,false);
-    }
-    
-    public void setSerialuid(String serialuid)
-    {
-        _serialuid = serialuid;
-    }
-
-    public String getSerialuid()
-    {
-        return _serialuid;
-    }
-    
-
-    public void setImplements(String implementsValue)
-    {
-        _implements = implementsValue;
-    }
-
-    public String getImplements()
-    {
-        return _implements;
-    }
-
-    public void setGeneratedComponentClass(Boolean generatedComponentClass)
-    {
-        _generatedComponentClass = generatedComponentClass;
-    }
-
-    public Boolean isGeneratedComponentClass()
-    {
-        return ModelUtils.defaultOf(_generatedComponentClass,false);
-    }
-
-    public void setGeneratedTagClass(Boolean generatedTagClass)
-    {
-        _generatedTagClass = generatedTagClass;
-    }
-
-    public Boolean isGeneratedTagClass()
-    {
-        return ModelUtils.defaultOf(_generatedTagClass,false);
-    }
-    
-    public void setTemplate(Boolean template)
-    {
-        _template = template;
-    }
-
-    public Boolean isTemplate()
-    {
-        return ModelUtils.defaultOf(_template,false);
-    }
-
-    /**
-     * Specifies if the component supports child components.
-     */
-    public void setChildren(Boolean children)
-    {
-        _children = children;
-    }
-
-    public Boolean hasChildren()
-    {
-        return ModelUtils.defaultOf(_children, true);
-    }
-
-    public void addFacet(FacetMeta prop)
-    {
-        _facets.put(prop.getName(), prop);
-    }
-
-    public Iterator facets()
-    {
-        return _facets.values().iterator();
-    }
-
-    public FacetMeta getFacet(String name)
-    {
-        return (FacetMeta) _facets.get(name);
-    }
-    
-    /**
-     * 
-     * @since 1.0.4
-     */
-    public String getDefaultEventName()
-    {
-        return _defaultEventName;
-    }
-
-    /**
-     * 
-     * @since 1.0.4
-     */
-    public void setDefaultEventName(String defaultEventName)
-    {
-        this._defaultEventName = defaultEventName;
-    }
-            
-    //THIS METHODS ARE USED FOR VELOCITY TO GET DATA AND GENERATE CLASSES
-    
-    public Collection getFacetList()
-    {
-        return _facets.values();
-    }
-    
-    private List _propertyTagList = null; 
-    
-    public Collection getPropertyTagList()
-    {
-        if (_propertyTagList == null)
-        {
-            _propertyTagList = new ArrayList();
-            for (Iterator it = getPropertyList().iterator(); it.hasNext();)
-            {
-                PropertyMeta prop = (PropertyMeta) it.next();
-                if (!prop.isTagExcluded().booleanValue() &&
-                        !prop.isInheritedTag().booleanValue())
-                {
-                    _propertyTagList.add(prop);
-                }
-            }
-            
-        }
-        return _propertyTagList;
-    }
-    
-    private List _propertyComponentList = null; 
-    
-    public Collection getPropertyComponentList()
-    {
-        if (_propertyComponentList == null)
-        {
-            _propertyComponentList = new ArrayList();
-            for (Iterator it = getPropertyList().iterator(); it.hasNext();)
-            {
-                PropertyMeta prop = (PropertyMeta) it.next();
-                if (!prop.isInherited().booleanValue() && prop.isGenerated().booleanValue())
-                {
-                    _propertyComponentList.add(prop);
-                }
-            }
-            
-        }
-        return _propertyComponentList;
-    }
-
-    /**
-     * Returns the package part of the tag class
-     * 
-     * @return
-     */
-    public String getTagPackage()
-    {
-        return StringUtils.substring(getTagClass(), 0, StringUtils.lastIndexOf(getTagClass(), '.'));
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ConverterMeta.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ConverterMeta.java
deleted file mode 100644
index cb0bccd..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ConverterMeta.java
+++ /dev/null
@@ -1,295 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.commons.digester.Digester;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.io.XmlWriter;
-
-/**
- * Store metadata about a class that is either a JSF Converter, or some base
- * class or interface that a Converter can be derived from.
- * <p>
- * A converter can be used in three ways:
- * <ul>
- * <li>instantiated via a tag,
- * <li>referenced via its id,
- * <li>implicitly used via its forClass property
- * </ul>
- */
-public class ConverterMeta extends ViewEntityMeta implements PropertyHolder
-{
-    private String _converterId;
-    private int _converterClassModifiers;
-    
-    //Some converters has its own tag class, so it's necessary to
-    //add some properties for this cases (f:convertNumber or f:convertDateTime)
-    private String _bodyContent;
-    private String _tagClass;
-    private String _tagSuperclass;
-    private String _serialuidtag;
-    
-    private Boolean _generatedTagClass;
-    private Boolean _configExcluded;
-
-    /**
-     * Write an instance of this class out as xml.
-     */
-    protected void writeXmlSimple(XmlWriter out)
-    {
-        super.writeXmlSimple(out);
-        out.writeElement("converterId", _converterId);
-        out.writeElement("bodyContent", _bodyContent);
-        out.writeElement("tagClass", _tagClass);
-        out.writeElement("tagSuperclass", _tagSuperclass);
-        out.writeElement("serialuidtag", _serialuidtag);
-        out.writeElement("generatedTagClass", _generatedTagClass);
-        out.writeElement("configExcluded", _configExcluded);
-    }
-
-    /**
-     * Add digester rules to repopulate an instance of this type from an xml
-     * file.
-     */
-    public static void addXmlRules(Digester digester, String prefix)
-    {
-        String newPrefix = prefix + "/converter";
-
-        digester.addObjectCreate(newPrefix, ConverterMeta.class);
-        digester.addSetNext(newPrefix, "addConverter");
-
-        ViewEntityMeta.addXmlRules(digester, newPrefix);
-
-        digester.addBeanPropertySetter(newPrefix + "/converterId");
-        digester.addBeanPropertySetter(newPrefix + "/bodyContent");
-        digester.addBeanPropertySetter(newPrefix + "/tagClass");
-        digester.addBeanPropertySetter(newPrefix + "/tagSuperclass");
-        digester.addBeanPropertySetter(newPrefix + "/serialuidtag");
-        digester.addBeanPropertySetter(newPrefix + "/generatedTagClass");
-        digester.addBeanPropertySetter(newPrefix + "/configExcluded");
-    }
-    
-    public ConverterMeta()
-    {
-        super("converter");
-    }
-
-    /**
-     * Merge the data in the specified other property into this one, throwing an
-     * exception if there is an incompatibility.
-     * 
-     * Not used right now since theorically there is very few inheritance
-     * on converters
-     * 
-     */
-    public void merge(ConverterMeta other)
-    {
-        super.merge(other);
-        _bodyContent = ModelUtils.merge(this._bodyContent, other._bodyContent);
-
-        boolean inheritParentTag = false;
-        //check if the parent set a tag class
-        if (other._tagClass != null)
-        {
-            //The tagSuperclass is the tagClass of the parent
-            _tagSuperclass = ModelUtils.merge(this._tagSuperclass,
-                    other._tagClass);
-            inheritParentTag = true;
-        }
-        else
-        {
-            //The tagSuperclass is the tagSuperclass of the parent
-            _tagSuperclass = ModelUtils.merge(this._tagSuperclass,
-                    other._tagSuperclass);            
-        }
-
-        _converterId = ModelUtils.merge(this._converterId, other._converterId);
-        
-        // TODO: _converterClassMOdifiers
-        
-        if (inheritParentTag)
-        {
-            for (Iterator i = this.properties(); i.hasNext();)
-            {
-                PropertyMeta srcProp = (PropertyMeta) i.next();
-                PropertyMeta parentProp = other.getProperty(srcProp.getName());
-                if (parentProp != null)
-                {
-                    //There are three possible behaviors:
-                    //1. The property is defined on the child again and
-                    //   the property was already on the tag hierarchy, so
-                    //   inheritedTag must be set to TRUE.
-                    //2. The property is defined on the child again and
-                    //   it is necessary to write again on the generated
-                    //   tag, so the annotation looks like
-                    //   "@JSFProperty inheritedTag=false"
-                    //   This condition must remain as FALSE
-                    //3. The property is set by the user as true, but there
-                    //   was not defined previously on the hierarchy, so
-                    //   this condition must be as is (TRUE) 
-                    //   (skipped on parentProp != null).
-                    if (srcProp.isLocalInheritedTag() == null ||
-                            srcProp.isInheritedTag().booleanValue())
-                    {
-                        srcProp.setInheritedTag(Boolean.TRUE);
-                    }
-                }
-            }
-            _propertyTagList = null;
-        }        
-
-    }
-
-    /**
-     * Sets the converter identifer for this component.
-     */
-    public void setConverterId(String converterId)
-    {
-        _converterId = converterId;
-    }
-
-    public String getConverterId()
-    {
-        return _converterId;
-    }
-
-    /**
-     * Adds a Java Language class modifier to the converter class.
-     * <p>
-     * TODO: what is this for????
-     */
-    public void addConverterClassModifier(int modifier)
-    {
-        _converterClassModifiers |= modifier;
-    }
-
-    /**
-     * Returns the Java Language class modifiers for the converter class. By
-     * default, these modifiers include Modifier.PUBLIC.
-     * 
-     * @return the Java Language class modifiers for the converter class
-     */
-    public int getConverterClassModifiers()
-    {
-        int modifiers = _converterClassModifiers;
-
-        if (!Modifier.isPrivate(modifiers) && !Modifier.isProtected(modifiers)
-                && !Modifier.isPublic(modifiers))
-        {
-            modifiers |= Modifier.PUBLIC;
-        }
-
-        return modifiers;
-    }
-
-    public void setBodyContent(String bodyContent)
-    {
-        this._bodyContent = bodyContent;
-    }
-
-    public String getBodyContent()
-    {
-        return _bodyContent;
-    }
-
-    /**
-     * Sets the JSP tag handler class for this component.
-     */
-    public void setTagClass(String tagClass)
-    {
-        _tagClass = tagClass;
-    }
-
-    public String getTagClass()
-    {
-        return _tagClass;
-    }
-    
-    /**
-     * Sets the JSP tag handler superclass for this component.
-     */
-    public void setTagSuperclass(String tagSuperclass)
-    {
-        _tagSuperclass = tagSuperclass;
-    }
-
-    public String getTagSuperclass()
-    {
-        return _tagSuperclass;
-    }
-    
-    public void setSerialuidtag(String serialuidtag)
-    {
-        _serialuidtag = serialuidtag;
-    }
-
-    public String getSerialuidtag()
-    {
-        return _serialuidtag;
-    }
-    
-    public void setGeneratedTagClass(Boolean generatedTagClass)
-    {
-        _generatedTagClass = generatedTagClass;
-    }
-
-    public Boolean isGeneratedTagClass()
-    {
-        return ModelUtils.defaultOf(_generatedTagClass,false);
-    }
-
-    public void setConfigExcluded(Boolean configExcluded)
-    {
-        _configExcluded = configExcluded;
-    }
-
-    public Boolean isConfigExcluded()
-    {
-        return ModelUtils.defaultOf(_configExcluded,false);
-    }    
-
-    //THIS METHODS ARE USED FOR VELOCITY TO GET DATA AND GENERATE CLASSES
-    
-    private List _propertyTagList = null; 
-    
-    public Collection getPropertyTagList()
-    {
-        if (_propertyTagList == null)
-        {
-            _propertyTagList = new ArrayList();
-            for (Iterator it = getPropertyList().iterator(); it.hasNext();)
-            {
-                PropertyMeta prop = (PropertyMeta) it.next();
-                if (!prop.isTagExcluded().booleanValue() &&
-                        !prop.isInheritedTag().booleanValue())
-                {
-                    _propertyTagList.add(prop);
-                }
-            }
-            
-        }
-        return _propertyTagList;
-    }
-
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/FacetHolder.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/FacetHolder.java
deleted file mode 100644
index a12d350..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/FacetHolder.java
+++ /dev/null
@@ -1,34 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import java.util.Iterator;
-
-/**
- * Interface for any artifact that has JSF facets on it.
- */
-public interface FacetHolder
-{
-    
-    Iterator facets();
-
-    FacetMeta getFacet(String name);
-
-    void addFacet(FacetMeta prop);
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/FacetMeta.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/FacetMeta.java
deleted file mode 100644
index 7bb7f27..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/FacetMeta.java
+++ /dev/null
@@ -1,195 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import org.apache.commons.digester.Digester;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.io.XmlWriter;
-
-/**
- * FacetBean is a Java representation of the faces-config component or
- * renderer facet XML element.
- */
-public class FacetMeta
-{
-    private String _longDescription;
-    private String _description;
-    private String _name;
-    private Boolean _required;
-    
-    private Boolean _inherited; //Define if this facet is inherited from parent component
-    private Boolean _generated; //Define if this facet should be generated
-
-    public FacetMeta()
-    {
-        
-    }
-    
-    public FacetMeta(FacetMeta pm)
-    {
-        _name = pm._name;
-        _required = pm._required;
-        _description = pm._description;
-        _longDescription = pm._longDescription;
-        _inherited = pm._inherited;
-    }
-    
-    /**
-     * Write this model out as xml.
-     */
-    public static void writeXml(XmlWriter out, FacetMeta am)
-    {
-        out.beginElement("facet");
-        out.writeElement("name", am._name);
-        out.writeElement("required", am._required);
-        out.writeElement("desc", am._description);
-        out.writeElement("longDesc", am._longDescription);
-        out.writeElement("inherited", am._inherited);
-        out.endElement("facet");
-    }
-
-    /**
-     * Add digester rules to repopulate a Model instance from an xml file.
-     */
-    public static void addXmlRules(Digester digester, String prefix)
-    {
-        String newPrefix = prefix + "/facet";
-
-        digester.addObjectCreate(newPrefix, FacetMeta.class);
-        digester.addSetNext(newPrefix, "addFacet");
-
-        digester.addBeanPropertySetter(newPrefix + "/name");
-        digester.addBeanPropertySetter(newPrefix + "/required");
-        digester.addBeanPropertySetter(newPrefix + "/desc", "description");
-        digester.addBeanPropertySetter(newPrefix + "/longDesc",
-                "longDescription");
-        digester.addBeanPropertySetter(newPrefix + "/inherited", "inherited");        
-    }
-
-    /**
-     * Merge the data in the specified other property into this one, throwing an
-     * exception if there is an incompatibility.
-     */
-    public void merge(FacetMeta other)
-    {
-        
-        _name = ModelUtils.merge(this._name, other._name);
-        _required = ModelUtils.merge(this._required, other._required);
-        _description = ModelUtils.merge(this._description, other._description);
-        _longDescription = ModelUtils.merge(this._longDescription, other._longDescription);        
-    }
-    
-    
-    
-    /**
-     * Sets the facet name for this facet.
-     *
-     * @param facetName  the facet name
-     */
-    public void setName(String name)
-    {
-        _name = name;
-    }
-    
-    /**
-     * Returns the facet name for this facet.
-     *
-     * @return  the facet name
-     */
-    public String getName()
-    {
-        return _name;
-    }
-    
-    /**
-     * Sets the description of this property.
-     *
-     * @param description  the property description
-     */
-    public void setDescription(String description)
-    {
-        _description = description;
-    }
-
-    /**
-     * Returns the description of this property.
-     *
-     * @return  the property description
-     */
-    public String getDescription()
-    {
-        return _description;
-    }
-
-    /**
-     * Sets the required flag of this facet.
-     *
-     * @param required  the facet required flag
-     */
-    public void setRequired(Boolean required)
-    {
-        _required = required;
-    }
-
-    /**
-     * Returns required flag of this facet.
-     *
-     * @return  the facet required flag
-     */
-    public Boolean isRequired()
-    {
-        return ModelUtils.defaultOf(_required,false);
-    }
-    
-    public void setLongDescription(String desc)
-    {
-        _longDescription = desc;
-    }
-
-    public String getLongDescription()
-    {
-        return _longDescription;
-    }
-    
-    public void setInherited(Boolean inherited)
-    {
-        _inherited = inherited;
-    }
-
-    public Boolean isInherited()
-    {
-        return ModelUtils.defaultOf(_inherited, false);
-    }
-    
-    public void setGenerated(Boolean generated)
-    {
-        _generated = generated;
-    }
-
-    /**
-     * Indicates if the property should be generated
-     * or not.
-     * 
-     * @return
-     */
-    public Boolean isGenerated()
-    {
-        return ModelUtils.defaultOf(_generated, false);
-    }
-    
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/MethodSignatureMeta.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/MethodSignatureMeta.java
deleted file mode 100644
index 8818a6f..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/MethodSignatureMeta.java
+++ /dev/null
@@ -1,124 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.commons.digester.Digester;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.io.XmlWriter;
-
-/**
- * MethodSignatureMeta is a Java representation of the faces-config component
- * property-extension method-signature XML element.
- */
-public class MethodSignatureMeta extends Object
-{
-    /**
-     * Creates a new MethodSignatureBean.
-     */
-    public MethodSignatureMeta()
-    {
-        _parameterTypes = new LinkedList();
-    }
-    
-    public static void addXmlRules(Digester digester, String prefix)
-    {
-        String newPrefix = prefix + "/methodBindingSignature";
-        digester.addObjectCreate(newPrefix , MethodSignatureMeta.class);
-        digester.addBeanPropertySetter(newPrefix +"/returnType", "returnType");
-        digester.addCallMethod(newPrefix +"/parameterType","addParameterType", 1);
-        digester.addCallParam(newPrefix +"/parameterType", 0);
-        digester.addSetNext(newPrefix ,"setMethodBindingSignature", MethodSignatureMeta.class.getName());
-        
-    }
-    
-    public static void writeXml(XmlWriter out, MethodSignatureMeta pm)
-    {
-        out.beginElement("methodBindingSignature");
-        out.writeElement("returnType", pm._returnType);
-        
-        for (Iterator i = pm._parameterTypes.iterator(); i.hasNext();)
-        {
-            String param = (String) i.next();
-            out.writeElement("parameterType", param);
-        }
-        
-        out.endElement("methodBindingSignature");
-    }
-
-    /**
-     * Adds a new parameter type to this method signature.
-     *
-     * @param parameterType  the parameter type
-     */
-    public void addParameterType(String parameterType)
-    {
-        _parameterTypes.add(parameterType);
-    }
-
-    /**
-     * Returns the list of parameter types as an array.
-     *
-     * @return  the parameter type list
-     */
-    public String[] getParameterTypes()
-    {
-        return (String[]) _parameterTypes.toArray(new String[0]);
-    }
-    
-    public String getParameterTypesAsString()
-    {
-        String[] params = this.getParameterTypes();
-        StringBuilder resp = new StringBuilder(); 
-        for (int i = 0; i < params.length; i++)
-        {
-          if (i > 0)
-          {
-            resp.append(", ");
-          }
-          resp.append(params[i]);
-        }
-        return resp.toString();
-    }
-
-    /**
-     * Sets the return type of this method signature.
-     *
-     * @param returnType  the method signature return type
-     */
-    public void setReturnType(String returnType)
-    {
-        _returnType = returnType;
-    }
-
-    /**
-     * Returns the return type of this method signature.
-     *
-     * @return  the method signature return type
-     */
-    public String getReturnType()
-    {
-        return _returnType;
-    }
-
-    private String _returnType;
-    private List _parameterTypes;
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/Model.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/Model.java
deleted file mode 100644
index 0c92728..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/Model.java
+++ /dev/null
@@ -1,357 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.logging.Logger;
-
-import org.apache.commons.digester.Digester;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.io.XmlWriter;
-
-/**
- * Stores info about all of the jsf artifacts in the system being processed.
- */
-public class Model
-{
-    static private final Logger _log = Logger.getLogger(Model.class.getName());
-
-    private List _components = new ArrayList(100);
-    private List _converters = new ArrayList(100);
-    private List _validators = new ArrayList(100);
-    private List _renderKits = new ArrayList(100);
-    private List _tags = new ArrayList(100);    
-
-    private Map _componentsByClass = new TreeMap();
-    private Map _convertersByClass = new TreeMap();
-    private Map _validatorsByClass = new TreeMap();
-    private Map _renderKitsById = new TreeMap();
-    private Map _tagsByClass =  new TreeMap();
-    private Map _componentsByTagClass = new TreeMap();
-    
-    private String _modelId;
-
-    /**
-     * Write this model out as xml.
-     * <p>
-     * Having a hand-coded method like this is not very elegant; it would be
-     * better to do this via some library like Betwixt. However I'm not very
-     * familiar with such libs, so hand-coding is quicker for now.
-     */
-    public static void writeXml(XmlWriter out, Model model)
-    {
-        out.beginElement("model");
-        out.writeElement("modelId", model._modelId);
-
-        for (Iterator i = model._components.iterator(); i.hasNext();)
-        {
-            ComponentMeta c = (ComponentMeta) i.next();
-            c.writeXml(out);
-        }
-
-        for (Iterator i = model._converters.iterator(); i.hasNext();)
-        {
-            ConverterMeta c = (ConverterMeta) i.next();
-            c.writeXml(out);
-        }
-
-        for (Iterator i = model._validators.iterator(); i.hasNext();)
-        {
-            ValidatorMeta c = (ValidatorMeta) i.next();
-            c.writeXml(out);
-        }
-        
-        for (Iterator i = model._renderKits.iterator(); i.hasNext();)
-        {
-            RenderKitMeta c = (RenderKitMeta) i.next();
-            RenderKitMeta.writeXml(out, c);
-        }
-        
-        for (Iterator i = model._tags.iterator(); i.hasNext();)
-        {
-            TagMeta c = (TagMeta) i.next();
-            c.writeXml(out);
-        }        
-
-        out.endElement("model");
-    }
-
-    /**
-     * Add digester rules to repopulate a Model instance from an xml file.
-     * <p>
-     * Having a hand-coded method like this is not very elegant; it would be
-     * better to do this via some library like Betwixt. However I'm not very
-     * familiar with such libs, so hand-coding is quicker for now.
-     */
-    public static void addXmlRules(Digester digester)
-    {
-        String prefix = "model";
-
-        digester.addObjectCreate(prefix, Model.class);
-        digester.addBeanPropertySetter(prefix + "/modelId");
-        ComponentMeta.addXmlRules(digester, prefix);
-        ConverterMeta.addXmlRules(digester, prefix);
-        ValidatorMeta.addXmlRules(digester, prefix);
-        RenderKitMeta.addXmlRules(digester, prefix);
-        TagMeta.addXmlRules(digester, prefix);
-    }
-    
-    /**
-     * Adds all components from the other model to this model, because
-     * only this info is necessary from construct a full model of 
-     * components and build correctly faces-config.xml, .tld, and
-     * component and tag classes.
-     * 
-     * @param other
-     */
-    public void merge(Model other)
-    {
-        for (Iterator it = other.getComponents().iterator(); it.hasNext();)
-        {
-            ComponentMeta component = (ComponentMeta) it.next();
-            //If the component is present, the actual takes precedence.
-            if (this.findComponentByClassName(component.getClassName())== null)
-            {
-                this.addComponent(component);
-            }
-        }
-        
-        for (Iterator it = other.getConverters().iterator(); it.hasNext();)
-        {
-            ConverterMeta converter = (ConverterMeta) it.next();
-            
-            if (this.findConverterByClassName(converter.getClassName())== null)
-            {
-                this.addConverter(converter);
-            }
-        }
-        
-        for (Iterator it = other.getValidators().iterator(); it.hasNext();)
-        {
-            ValidatorMeta validator = (ValidatorMeta) it.next();
-            
-            if (this.findValidatorByClassName(validator.getClassName())== null)
-            {
-                this.addValidator(validator);
-            }
-        }
-        
-        for (Iterator it = other.getTags().iterator(); it.hasNext();)
-        {
-            TagMeta validator = (TagMeta) it.next();
-            
-            if (this.findTagByClassName(validator.getClassName())== null)
-            {
-                this.addTag(validator);
-            }
-        }        
-    }
-
-    /**
-     * Adds a component to this faces config document.
-     * 
-     * @param component
-     *            the component to add
-     */
-    public void addComponent(ComponentMeta component)
-    {
-        _components.add(component);
-        _componentsByClass.put(component.getClassName(), component);
-        if (null != component.getTagClass())
-        {
-            _componentsByTagClass.put(component.getTagClass(), component);
-        }
-    }
-
-    /**
-     * Returns all components
-     */
-    public List getComponents()
-    {
-        return _components;
-    }
-
-    /**
-     * Returns an iterator for all components.
-     */
-    public Iterator components()
-    {
-        return _components.iterator();
-    }
-
-    public ComponentMeta findComponentByClassName(String className)
-    {
-        return (ComponentMeta) _componentsByClass.get(className);
-    }
-
-    public ComponentMeta findComponentByTagClassName(String className)
-    {
-        return (ComponentMeta) _componentsByTagClass.get(className);
-    }
-    /**
-     * Holds info about a JSF Converter definition
-     */
-    public void addConverter(ConverterMeta converter)
-    {
-        _converters.add(converter);
-        _convertersByClass.put(converter.getClassName(), converter);
-    }
-
-    /**
-     * Returns all converters
-     */
-    public List getConverters()
-    {
-        return _converters;
-    }
-
-    /**
-     * Returns an iterator for all converters
-     */
-    public Iterator converters()
-    {
-        return _converters.iterator();
-    }
-
-    public ConverterMeta findConverterByClassName(String className)
-    {
-        return (ConverterMeta) _convertersByClass.get(className);
-    }
-
-    /**
-     * Holds info about a JSF Converter definition
-     */
-    public void addValidator(ValidatorMeta validator)
-    {
-        _validators.add(validator);
-        _validatorsByClass.put(validator.getClassName(), validator);
-    }
-
-    /**
-     * Returns all validators
-     */
-    public List getValidators()
-    {
-        return _validators;
-    }
-
-    /**
-     * Returns an iterator for all validators
-     */
-    public Iterator validators()
-    {
-        return _validators.iterator();
-    }
-
-    public ValidatorMeta findValidatorByClassName(String className)
-    {
-        return (ValidatorMeta) _validatorsByClass.get(className);
-    }
-
-    /**
-     * Adds a render kit to this faces config document.
-     * 
-     * @param renderKit
-     *            the render kit to add
-     */
-    public void addRenderKit(RenderKitMeta renderKit)
-    {
-        _renderKits.add(renderKit);
-        _renderKitsById.put(renderKit.getRenderKitId(), renderKit);
-    }
-
-    public List getRenderKits()
-    {
-        return _renderKits;
-    }
-
-    /**
-     * Returns an iterator for all render kits in this faces config.
-     * 
-     * @return the render kit iterator
-     */
-    public Iterator renderKits()
-    {
-        return _renderKits.iterator();
-    }
-
-    /**
-     * Returns the render kit for this render kit id.
-     * 
-     * @param renderKitId
-     *            the render kit id to find
-     */
-    public RenderKitMeta findRenderKitById(String id)
-    {
-        return (RenderKitMeta) _renderKitsById.get(id);
-    }
-    
-    /**
-     * Adds a tag to this faces config document.
-     * 
-     * @param tag
-     *            the tag to add
-     */
-    public void addTag(TagMeta tag)
-    {
-        _tags.add(tag);
-        _tagsByClass.put(tag.getClassName(), tag);
-    }
-
-    /**
-     * Returns all tags
-     */
-    public List getTags()
-    {
-        return _tags;
-    }
-
-    /**
-     * Returns an iterator for all tags.
-     */
-    public Iterator tags()
-    {
-        return _tags.iterator();
-    }
-
-    public TagMeta findTagByClassName(String className)
-    {
-        return (TagMeta) _tagsByClass.get(className);
-    }
-    
-
-    public void setModelId(String modelId)
-    {
-        this._modelId = modelId;
-    }
-
-    /**
-     * Obtain a value that indicate from where this model
-     * comes from.
-     * 
-     * @return
-     */
-    public String getModelId()
-    {
-        return _modelId;
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ModelUtils.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ModelUtils.java
deleted file mode 100644
index 30f3c10..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ModelUtils.java
+++ /dev/null
@@ -1,128 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import java.util.Iterator;
-
-/**
- * Simple static helper methods.
- */
-public class ModelUtils
-{
-    /**
-     * Inherit setting only if current one is empty.
-     */
-    public static String merge(String curr, String inherited)
-    {
-        if (curr != null)
-        {
-            return curr;
-        }
-        return inherited;
-    }
-    
-    /**
-     * Inherit setting only if current one is empty.
-     */
-    public static Object merge(Object curr, Object inherited)
-    {
-        if (curr != null)
-        {
-            return curr;
-        }
-        return inherited;
-    }    
-    
-    /**
-     * Inherit setting only if current one is empty.
-     */
-    public static Boolean merge(Boolean curr, Boolean inherited)
-    {
-        if (curr != null)
-        {
-            return curr;
-        }
-        return inherited;
-    }
-
-    /**
-     * Return a default value if a boolean property is null.
-     */
-    public static Boolean defaultOf(Boolean val, boolean dflt)
-    {
-        if (val != null)
-        {
-            return val;
-        }
-        else
-        {
-            return Boolean.valueOf(dflt);
-        }
-    }
-
-    /**
-     * Given two JSF artifacts that can have associated user-settable properties,
-     * merge all the properties one one into the other.
-     * <p>
-     * The dst object is expected to be a "child" of the src object. Any data on dst
-     * therefore overrides stuff on src, but otherwise everything on src gets copied
-     * to dst.
-     */
-    public static void mergeProps(PropertyHolder dst, PropertyHolder src)
-    {
-        for (Iterator i = src.properties(); i.hasNext();)
-        {
-            PropertyMeta srcProp = (PropertyMeta) i.next();
-            PropertyMeta dstProp = dst.getProperty(srcProp.getName());
-            if (dstProp == null)
-            {
-                // Just copy the whole property unaltered
-                dstProp = new PropertyMeta(srcProp);
-                dstProp.setInherited(Boolean.TRUE);
-                dst.addProperty(dstProp);
-            }
-            else
-            {
-                // merge the two property objects together
-                dstProp.merge(srcProp);
-            }
-        }
-    }
-    
-    public static void mergeFacets(FacetHolder dst, FacetHolder src)
-    {
-        for (Iterator i = src.facets(); i.hasNext();)
-        {
-            FacetMeta srcProp = (FacetMeta) i.next();
-            FacetMeta dstProp = dst.getFacet(srcProp.getName());
-            if (dstProp == null)
-            {
-                // Just copy the whole property unaltered
-                dstProp = new FacetMeta(srcProp);
-                dstProp.setInherited(Boolean.TRUE);
-                dst.addFacet(dstProp);
-            }
-            else
-            {
-                // merge the two property objects together
-                dstProp.merge(srcProp);
-            }
-        }
-    }    
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/PropertyHolder.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/PropertyHolder.java
deleted file mode 100644
index bc73237..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/PropertyHolder.java
+++ /dev/null
@@ -1,36 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * Interface for any artifact that has JSF properties on it.
- */
-public interface PropertyHolder
-{
-    Iterator properties();
-
-    PropertyMeta getProperty(String name);
-
-    void addProperty(PropertyMeta prop);
-    
-    Map getProperties();
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/PropertyMeta.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/PropertyMeta.java
deleted file mode 100644
index a4351cc..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/PropertyMeta.java
+++ /dev/null
@@ -1,573 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import org.apache.commons.digester.Digester;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.io.XmlWriter;
-
-/**
- * Store metadata about a bean property of a component, converter or other JSF
- * artifact.
- * <p>
- * This metadata defines the attributes of JSP tags, among other things.
- */
-public class PropertyMeta
-{
-    private String _name;
-    private String _className;
-    private String _jspName;
-    private String _fieldName;    
-    private Boolean _required;
-    private Boolean _literalOnly;
-    private Boolean _transient;
-    private Boolean _stateHolder;
-    private String _description;
-    private String _longDescription;
-    private String   _defaultValue;
-    private MethodSignatureMeta _signature;
-    
-    private Boolean _inherited; //Define if this property is inherited from parent component
-    private Boolean _inheritedTag; //Define if this property is inherited from tag component
-    private Boolean _tagExcluded; //Define if this property is excluded from tag and tld
-    
-    private Boolean _generated;
-    
-    private String _localMethodScope;
-    private Boolean _localMethod; //generate method that returns local value without evaluate EL
-    private String _setMethodScope;
-    private Boolean _setMethod; //Generate method to define if is set a value or not
-    
-    private Boolean _rtexprvalue;
-    private String _clientEvent;
-    
-    private String _deferredValueType;
-
-    public PropertyMeta()
-    {
-        
-    }
-    
-    public PropertyMeta(PropertyMeta pm)
-    {
-        _name = pm._name;
-        _className = pm._className;
-        _jspName = pm._jspName;
-        _fieldName = pm._fieldName;    
-        _required = pm._required;
-        _literalOnly = pm._literalOnly;
-        _transient = pm._transient;
-        _stateHolder = pm._stateHolder;
-        _description = pm._description;
-        _longDescription = pm._longDescription;
-        _defaultValue = pm._defaultValue;
-        _signature = pm._signature;
-        
-        _inherited = pm._inherited;
-        _inheritedTag = pm._inheritedTag;
-        _tagExcluded = pm._tagExcluded;
-        
-        _generated = pm._generated;
-        _localMethodScope = pm._localMethodScope;
-        _localMethod = pm._localMethod;
-        _setMethodScope = pm._setMethodScope;
-        _setMethod = pm._setMethod;
-        _rtexprvalue = pm._rtexprvalue;
-        _deferredValueType = pm._deferredValueType;
-        _clientEvent = pm._clientEvent;
-    }
-    
-    /**
-     * Write this model out as xml.
-     */
-    public static void writeXml(XmlWriter out, PropertyMeta pm)
-    {
-        out.beginElement("property");
-        out.writeElement("name", pm._name);
-        if (pm._jspName != null)
-        {
-            out.writeElement("jspName", pm._jspName);
-        }
-        if (pm._fieldName != null)
-        {
-            out.writeElement("fieldName", pm._fieldName);
-        }
-        out.writeElement("className", pm._className);
-        out.writeElement("required", pm._required);
-        out.writeElement("literalOnly", pm._literalOnly);
-        out.writeElement("transient", pm._transient);
-        out.writeElement("stateHolder", pm._stateHolder);
-        out.writeElement("desc", pm._description);
-        out.writeElement("longDesc", pm._longDescription);
-        out.writeElement("defaultValue", pm._defaultValue);
-        if (pm._signature != null)
-        {
-            MethodSignatureMeta.writeXml(out, pm._signature);
-        }
-        out.writeElement("inherited", pm._inherited);
-        out.writeElement("inheritedTag", pm._inheritedTag);
-        out.writeElement("tagExcluded", pm._tagExcluded);
-        out.writeElement("generated",pm._generated);
-        out.writeElement("localMethodScope", pm._localMethodScope);
-        out.writeElement("localMethod", pm._localMethod);
-        out.writeElement("setMethodScope", pm._setMethodScope);
-        out.writeElement("setMethod", pm._setMethod);
-        out.writeElement("rtexprvalue", pm._rtexprvalue);
-        out.writeElement("deferredValueType", pm._deferredValueType);
-        out.writeElement("clientEvent", pm._clientEvent);
-        out.endElement("property");
-    }
-
-    /**
-     * Add digester rules to repopulate a Model instance from an xml file.
-     */
-    public static void addXmlRules(Digester digester, String prefix)
-    {
-        String newPrefix = prefix + "/property";
-
-        digester.addObjectCreate(newPrefix, PropertyMeta.class);
-        digester.addSetNext(newPrefix, "addProperty");
-
-        digester.addBeanPropertySetter(newPrefix + "/name");
-        digester.addBeanPropertySetter(newPrefix + "/jspName");
-        digester.addBeanPropertySetter(newPrefix + "/fieldName");
-        digester.addBeanPropertySetter(newPrefix + "/className");
-        digester.addBeanPropertySetter(newPrefix + "/required");
-        digester.addBeanPropertySetter(newPrefix + "/literalOnly");
-        digester.addBeanPropertySetter(newPrefix + "/transient");
-        digester.addBeanPropertySetter(newPrefix + "/stateHolder");
-        digester.addBeanPropertySetter(newPrefix + "/desc", "description");
-        digester.addBeanPropertySetter(newPrefix + "/longDesc",
-                "longDescription");
-        digester.addBeanPropertySetter(newPrefix + "/defaultValue", "defaultValue");
-        digester.addBeanPropertySetter(newPrefix + "/inherited", "inherited");
-        digester.addBeanPropertySetter(newPrefix + "/inheritedTag", "inheritedTag");
-        digester.addBeanPropertySetter(newPrefix + "/tagExcluded", "tagExcluded");
-        digester.addBeanPropertySetter(newPrefix + "/generated", "generated");
-        digester.addBeanPropertySetter(newPrefix + "/localMethodScope", "localMethodScope");
-        digester.addBeanPropertySetter(newPrefix + "/localMethod", "localMethod");
-        digester.addBeanPropertySetter(newPrefix + "/setMethodScope", "setMethodScope");
-        digester.addBeanPropertySetter(newPrefix + "/setMethod", "setMethod");
-        digester.addBeanPropertySetter(newPrefix + "/rtexprvalue", "rtexprvalue");
-        digester.addBeanPropertySetter(newPrefix + "/deferredValueType", "deferredValueType");
-        digester.addBeanPropertySetter(newPrefix + "/clientEvent", "clientEvent");
-        MethodSignatureMeta.addXmlRules(digester, newPrefix);
-        
-    }
-
-    /**
-     * Merge the data in the specified other property into this one, throwing an
-     * exception if there is an incompatibility.
-     */
-    public void merge(PropertyMeta other)
-    {
-        // Merge className does not harm, since you cannot
-        //use polymorphism on a jsf component.  
-        _className = ModelUtils.merge(this._className, other._className);
-        
-        _name = ModelUtils.merge(this._name, other._name);
-        _jspName = ModelUtils.merge(this._jspName, other._jspName);
-        _fieldName = ModelUtils.merge(this._fieldName, other._fieldName);
-        _required = ModelUtils.merge(this._required, other._required);
-        _literalOnly = ModelUtils.merge(this._literalOnly, other._literalOnly);
-        _transient = ModelUtils.merge(this._transient, other._transient);
-        _stateHolder = ModelUtils.merge(this._stateHolder, other._stateHolder);
-        _description = ModelUtils.merge(this._description, other._description);
-        _longDescription = ModelUtils.merge(this._longDescription, other._longDescription);
-        _defaultValue = ModelUtils.merge(this._defaultValue, other._defaultValue);
-        _signature = (MethodSignatureMeta) ModelUtils.merge(this._signature, other._signature);
-        _generated = ModelUtils.merge(this._generated, other._generated);
-        _localMethod = ModelUtils.merge(this._localMethod, other._localMethod);
-        _localMethodScope = ModelUtils.merge(this._localMethodScope, other._localMethodScope);
-        _setMethodScope = ModelUtils.merge(this._setMethodScope, other._setMethodScope);
-        _setMethod = ModelUtils.merge(this._setMethod, other._setMethod);
-        _tagExcluded = ModelUtils.merge(this._tagExcluded, other._tagExcluded);
-        _rtexprvalue = ModelUtils.merge(this._rtexprvalue, other._rtexprvalue);
-        _deferredValueType = ModelUtils.merge(this._deferredValueType, other._deferredValueType);
-        _clientEvent = ModelUtils.merge(this._clientEvent, other._clientEvent);
-    }
-
-    /**
-     * Set the name that users refer to this property by.
-     * <p>
-     * This sets the name of xml tag attributes, and the base names of generated
-     * getter/setter methods.
-     */
-    public void setName(String name)
-    {
-        _name = name;
-    }
-
-    public String getName()
-    {
-        return _name;
-    }
-
-    /**
-     * Set the fully-qualified name of the type of this property.
-     */
-    public void setClassName(String className)
-    {
-        this._className = className;
-    }
-
-    public String getClassName()
-    {
-        return _className;
-    }
-
-    /**
-     * Specify whether this property is transient or not.
-     * <p>
-     * Transient properties are not saved in the view state and are not restored
-     * during the "restore view" phase.
-     */
-    public void setTransient(Boolean state)
-    {
-        _transient = state;
-    }
-
-    public Boolean isTransient()
-    {
-        return ModelUtils.defaultOf(_transient, false);
-    }
-
-    /**
-     * Specify whether this property is required, ie whether it is a syntax
-     * error for someone to use a tag for a component with this property but not
-     * explicitly provide a value for this property.
-     */
-    public void setRequired(Boolean required)
-    {
-        _required = required;
-    }
-
-    public Boolean isRequired()
-    {
-        return ModelUtils.defaultOf(_required, false);
-    }
-
-    /**
-     * Specify whether this property accepts only literal (constant) values, or
-     * whether this property can be mapped to an EL expression.
-     */
-    public void setLiteralOnly(Boolean literalOnly)
-    {
-        _literalOnly = literalOnly;
-    }
-
-    public Boolean isLiteralOnly()
-    {
-        return ModelUtils.defaultOf(_literalOnly, false);
-    }
-
-    public void setDescription(String desc)
-    {
-        _description = desc;
-    }
-
-    public String getDescription()
-    {
-        return _description;
-    }
-
-    public void setLongDescription(String desc)
-    {
-        _longDescription = desc;
-    }
-
-    public String getLongDescription()
-    {
-        return _longDescription;
-    }
-    
-    /**
-     * Sets the default value of this attribute.
-     *
-     * @param defaultValue  the attribute default value
-     */
-    public void setDefaultValue(String defaultValue)
-    {
-      _defaultValue = defaultValue;
-    }
-
-    /**
-     * Returns the default value of this attribute.
-     *
-     * @return  the attribute default value
-     */
-    public String getDefaultValue()
-    {
-      return _defaultValue;
-    }
-    
-    /**
-     * Sets the JSP name of this property.
-     *
-     * @param jspName  the JSP property name
-     */
-    public void setJspName(String jspName)
-    {
-      _jspName = jspName;
-    }
-
-    /**
-     * Returns the JSP name of this property.
-     *
-     * @return  the JSP property name
-     */
-    public String getJspName()
-    {
-      if (_jspName == null)
-      {
-        return getName();
-      }
-
-      return _jspName;
-    }
-
-    /**
-     * Sets the field name of this property, when not generating Trinidad components
-     *
-     * @param fieldName  the field property name
-     */
-    public void setFieldName(String fieldName)
-    {
-      _fieldName = fieldName;
-    }
-
-    /**
-     * Returns the field name of this property, when not generating Trinidad components
-     *
-     * @return  the field property name
-     */
-    public String getFieldName()
-    {
-      if (_fieldName == null)
-      {
-        return "_"+getName();
-      }
-
-      return _fieldName;
-    }
-            
-    /**
-     * Sets the method binding signature of this property.
-     *
-     * @param signature  the method binding signature of this property
-     */
-    public void setMethodBindingSignature(
-      MethodSignatureMeta signature)
-    {
-      _signature = signature;
-    }
-
-    /**
-     * Returns the method binding signature of this property.
-     *
-     * @return the method binding signature of this property
-     */
-    public MethodSignatureMeta getMethodBindingSignature()
-    {
-      return _signature;
-    }
-    
-    public void setInherited(Boolean inherited)
-    {
-        _inherited = inherited;
-    }
-
-    public Boolean isInherited()
-    {
-        return ModelUtils.defaultOf(_inherited, false);
-    }
-
-    public void setInheritedTag(Boolean inheritedTag)
-    {
-        _inheritedTag = inheritedTag;
-    }
-
-    /**
-     * Returns true if this property was inherited from an ancestor component
-     * which has no associated tag class.
-     * <p>
-     * When a tag class is generated for <i>this</i> component, then the tag
-     * class will need to define a setter method to handle this property.
-     * <p>
-     * However properties which are inherited from an ancestor component that
-     * does have a tag class will not need 
-     * @param inheritedTag
-     */
-    public Boolean isInheritedTag()
-    {
-        return ModelUtils.defaultOf(_inheritedTag, false);
-    }
-    
-    /**
-     * 
-     */
-    public Boolean isLocalInheritedTag()
-    {
-        return _inheritedTag;
-    }
-    
-    public void setTagExcluded(Boolean tagExcluded)
-    {
-        _tagExcluded = tagExcluded;
-    }
-
-    public Boolean isTagExcluded()
-    {
-        return ModelUtils.defaultOf(_tagExcluded, false);
-    }
-    
-    public void setGenerated(Boolean generated)
-    {
-        _generated = generated;
-    }
-
-    /**
-     * Indicates if the property should be generated
-     * or not.
-     * 
-     * @return
-     */
-    public Boolean isGenerated()
-    {
-        return ModelUtils.defaultOf(_generated, false);
-    }
-
-    public void setStateHolder(Boolean stateHolder)
-    {
-        _stateHolder = stateHolder;
-    }
-
-    public Boolean isStateHolder()
-    {
-        return ModelUtils.defaultOf(_stateHolder, false);
-    }
-
-    public void setLocalMethodScope(String localMethodScope)
-    {
-        _localMethodScope = localMethodScope;
-    }
-
-    public String getLocalMethodScope()
-    {
-        return _localMethodScope == null ? "protected" : _localMethodScope;
-    }
-
-    public void setLocalMethod(Boolean localMethod)
-    {
-        _localMethod = localMethod;
-    }
-
-    public Boolean isLocalMethod()
-    {
-        return ModelUtils.defaultOf(_localMethod,false);
-    }
-
-    public void setSetMethodScope(String setMethodScope)
-    {
-        _setMethodScope = setMethodScope;
-    }
-
-    public String getSetMethodScope()
-    {
-        return _setMethodScope == null ? "protected" : _setMethodScope;
-    }
-
-    public void setSetMethod(Boolean setMethod)
-    {
-        _setMethod = setMethod;
-    }
-    
-    public void setRtexprvalue(Boolean rtexprvalue)
-    {
-        _rtexprvalue = rtexprvalue;
-    }
-
-    public Boolean isRtexprvalue()
-    {
-        return _rtexprvalue;
-    }
-    
-
-    public Boolean isSetMethod()
-    {
-        return ModelUtils.defaultOf(_setMethod,false);
-    }
-
-    /**
-     * Returns true if this property is a method binding.
-     * <p>
-     * TODO: what is this for?
-     */
-    public boolean isMethodBinding()
-    {
-        return ("javax.faces.el.MethodBinding".equals(getClassName()));
-    }
-
-    /**
-     * Returns true if this property is a method binding.
-     * <p>
-     * TODO: what is this for?
-     */
-    public boolean isMethodExpression()
-    {
-        return ("javax.el.MethodExpression".equals(getClassName()));
-    }
-    
-    /**
-     * @since 1.0.3
-     */
-    public void setDeferredValueType(String deferredValueType)
-    {
-        _deferredValueType = deferredValueType;
-    }
-    
-    /**
-     * Indicate the type that values should be
-     * cast on tld. It is supposed that the className is
-     * javax.el.ValueExpression to apply it. 
-     *
-     * @since 1.0.3
-     */
-    public String getDeferredValueType()
-    {
-        return _deferredValueType;
-    }
-
-    /**
-     * 
-     * @since 1.0.4
-     */
-    public String getClientEvent()
-    {
-        return _clientEvent;
-    }
-
-    /**
-     * 
-     * @since 1.0.4
-     */
-    public void setClientEvent(String clientEvent)
-    {
-        this._clientEvent = clientEvent;
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/RenderKitMeta.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/RenderKitMeta.java
deleted file mode 100644
index 408af1c..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/RenderKitMeta.java
+++ /dev/null
@@ -1,182 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.apache.commons.digester.Digester;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.io.XmlWriter;
-
-/**
- * Store metadata about a JSF RenderKit.
- */
-public class RenderKitMeta
-{
-    private String _className;
-
-    private String _renderKitId = "";
-    private Map _renderers;
-
-    /**
-     * Write an instance of this class out as xml.
-     */
-    public static void writeXml(XmlWriter out, RenderKitMeta rkm)
-    {
-        out.beginElement("renderKit");
-                
-        out.writeElement("renderKitId", rkm._renderKitId);
-        out.writeElement("className", rkm._className);
-        
-        for (Iterator it = rkm._renderers.values().iterator();it.hasNext();)
-        {
-            RendererMeta rm = (RendererMeta) it.next();
-            rm.writeXml(out);  
-        }
-        
-        out.endElement("renderKit");        
-    }
-    
-    /**
-     * Add digester rules to repopulate an instance of this type from an xml
-     * file.
-     */
-    public static void addXmlRules(Digester digester, String prefix)
-    {
-        String newPrefix = prefix + "/renderKit";
-
-        digester.addObjectCreate(newPrefix, RenderKitMeta.class);
-        digester.addSetNext(newPrefix, "addRenderKit");
-
-        ClassMeta.addXmlRules(digester, newPrefix);
-
-        digester.addBeanPropertySetter(newPrefix + "/renderKitId");
-        digester.addBeanPropertySetter(newPrefix + "/className");
-        
-        RendererMeta.addXmlRules(digester, newPrefix);
-    }
-
-
-    /**
-     * Creates a new RenderKitBean.
-     */
-    public RenderKitMeta()
-    {
-        _renderers = new TreeMap();
-    }
-
-    /**
-     * The name of the class that this metadata applies to.
-     */
-    public String getClassName()
-    {
-        return _className;
-    }
-
-    public void setClassName(String className)
-    {
-        _className = className;
-    }
-
-    /**
-     * Sets the render kit id for this component.
-     * 
-     * @param renderKitId
-     *            the render kit id
-     */
-    public void setRenderKitId(String renderKitId)
-    {
-        _renderKitId = renderKitId;
-    }
-
-    /**
-     * Returns the render kit id type for this component.
-     * 
-     * @return the render kit id
-     */
-    public String getRenderKitId()
-    {
-        return _renderKitId;
-    }
-
-    /**
-     * Adds a renderer to this render kit.
-     * 
-     * @param renderer
-     *            the renderer to add
-     */
-    public void addRenderer(RendererMeta renderer)
-    {
-        String componentFamily = renderer.getComponentFamily();
-        String rendererType = renderer.getRendererType();
-        String compositeKey = componentFamily + "|" + rendererType;
-        _renderers.put(compositeKey, renderer);
-    }
-
-    /**
-     * Returns the renderer for this component family and renderer type.
-     * 
-     * @param componentFamily
-     *            the component family
-     * @param rendererType
-     *            the renderer type
-     */
-    public RendererMeta findRenderer(String componentFamily,
-            String rendererType)
-    {
-        String compositeKey = componentFamily + "|" + rendererType;
-        return (RendererMeta) _renderers.get(compositeKey);
-    }
-
-    /**
-     * Returns true if this render kit has any renderers.
-     * 
-     * @return true if this render kit has any renderers, false otherwise
-     */
-    public boolean hasRenderers()
-    {
-        return !_renderers.isEmpty();
-    }
-
-    /**
-     * Returns an iterator for all renderers in this render kit.
-     * 
-     * @return the renderer iterator
-     */
-    public Iterator renderers()
-    {
-        return _renderers.values().iterator();
-    }
-    
-    public Collection getRenderers()
-    {
-        return _renderers.values();
-    }
-
-    void addAllRenderers(RenderKitMeta renderKit)
-    {
-        for (Iterator i = renderKit._renderers.values().iterator(); i.hasNext();)
-        {
-            // use addRenderer to establish owner
-            addRenderer((RendererMeta) i.next());
-        }
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/RendererMeta.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/RendererMeta.java
deleted file mode 100644
index 754b546..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/RendererMeta.java
+++ /dev/null
@@ -1,136 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import org.apache.commons.digester.Digester;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.io.XmlWriter;
-
-
-/**
- * Store metadata about a class that is either a JSF Renderer, or some base
- * class or interface that a Renderer can be derived from.
- */
-public class RendererMeta extends ClassMeta
-{
-    private String _description;
-    private String _componentFamily;
-    private String _rendererType;
-
-    /**
-     * Write an instance of this class out as xml.
-     */
-    protected void writeXmlSimple(XmlWriter out)
-    {
-        super.writeXmlSimple(out);
-        
-        out.writeElement("componentFamily", _componentFamily);
-        out.writeElement("rendererType", _rendererType);
-        out.writeElement("description", _description);
-    }
-    
-    /**
-     * Add digester rules to repopulate an instance of this type from an xml
-     * file.
-     */
-    public static void addXmlRules(Digester digester, String prefix)
-    {
-        String newPrefix = prefix + "/renderer";
-
-        digester.addObjectCreate(newPrefix, RendererMeta.class);
-        digester.addSetNext(newPrefix, "addRenderer");
-
-        ClassMeta.addXmlRules(digester, newPrefix);
-
-        digester.addBeanPropertySetter(newPrefix + "/componentFamily");
-        digester.addBeanPropertySetter(newPrefix + "/rendererType");
-        digester.addBeanPropertySetter(newPrefix + "/description");
-    }
-    
-    /**
-     * Creates a new RendererBean.
-     */
-    public RendererMeta()
-    {
-        super("renderer");
-    }    
-
-    /**
-     * Sets the component family for this component.
-     * 
-     * @param componentFamily
-     *            the component family
-     */
-    public void setComponentFamily(String componentFamily)
-    {
-        _componentFamily = componentFamily;
-    }
-
-    /**
-     * Returns the component family for this component.
-     * 
-     * @return the component family
-     */
-    public String getComponentFamily()
-    {
-        return _componentFamily;
-    }
-
-    /**
-     * Sets the renderer type for this component.
-     * 
-     * @param rendererType
-     *            the renderer type
-     */
-    public void setRendererType(String rendererType)
-    {
-        _rendererType = rendererType;
-    }
-
-    /**
-     * Returns the renderer type for this component.
-     * 
-     * @return the renderer type
-     */
-    public String getRendererType()
-    {
-        return _rendererType;
-    }
-
-    /**
-     * Sets the description of this attribute.
-     * 
-     * @param description
-     *            the attribute description
-     */
-    public void setDescription(String description)
-    {
-        _description = description;
-    }
-
-    /**
-     * Returns the description of this attribute.
-     * 
-     * @return the attribute description
-     */
-    public String getDescription()
-    {
-        return _description;
-    }
-
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/TagMeta.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/TagMeta.java
deleted file mode 100644
index ea5338d..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/TagMeta.java
+++ /dev/null
@@ -1,254 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.apache.commons.digester.Digester;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.io.XmlWriter;
-
-/**
- * Represents metadata about a class that is just a pure JSF Tag class,
- * with no corresponding JSF component, validator or converter.
- * <p>
- * There are not very many pure tag classes, but there are a few. One
- * example is the f:attribute tag from the JSF core specification, which
- * exists solely to store an entry into the attributes map of some other
- * component when the view is first created.
- * <p>
- * Another example is the f:converter tag, which creates a corresponding
- * converter component by id, and stores it into the view. The tag 
- * doesn't correspond to any particular converter class, so there is
- * no converter class whose annotations can be used to describe this
- * generic tag. Note that specific converters can also have their own
- * dedicated tags (eg f:convertDateTime) in which case the TLD entry
- * is generated using metadata from the converter class.
- * <p>
- * Another case when this is needed is where there are multiple tags that
- * correspond to a single component class. For example, in the core
- * implementation both f:outputText and f:verbatim are implemented with
- * the UIOutputText component. In this case, the component is used to
- * generate one TLD entry (the "primary" tag) but TLD entries for the
- * "secondary" tag must be triggered in another way.
- * <p>
- * In the above cases, the tag class itself can be annotated with this
- * annotation. During TLD file generation, an appropriate entry is then
- * added.
- * <p>
- * An alternative is to omit this entry, and simply write the TLD
- * entries for these few classes by hand in the "base" file that gets
- * included into the generated one.
- */
-public class TagMeta extends ClassMeta implements AttributeHolder
-{
-    private String _name;
-    private String _bodyContent;
-    private String _description;
-    private String _longDescription;
-    private String _tagHandler;
-
-    protected Map _attributes;
-    
-    /**
-     * Write an instance of this class out as xml.
-     */
-    protected void writeXmlSimple(XmlWriter out)
-    {
-        super.writeXmlSimple(out);
-
-        out.writeElement("name", _name);
-        out.writeElement("bodyContent", _bodyContent);
-        out.writeElement("desc", _description);
-        out.writeElement("longDesc", _longDescription);
-        out.writeElement("tagHandler", _tagHandler);
-
-        for (Iterator i = _attributes.values().iterator(); i.hasNext();)
-        {
-            AttributeMeta prop = (AttributeMeta) i.next();
-            AttributeMeta.writeXml(out, prop);
-        }
-    }
-
-    /**
-     * Add digester rules to repopulate an instance of this type from an xml
-     * file.
-     */
-    public static void addXmlRules(Digester digester, String prefix)
-    {
-        String newPrefix = prefix + "/tag";
-
-        digester.addObjectCreate(newPrefix, TagMeta.class);
-        digester.addSetNext(newPrefix, "addTag");
-
-        ClassMeta.addXmlRules(digester, newPrefix);
-        digester.addBeanPropertySetter(newPrefix + "/name", "name");
-        digester.addBeanPropertySetter(newPrefix + "/bodyContent", "bodyContent");
-        digester.addBeanPropertySetter(newPrefix + "/desc", "description");
-        digester.addBeanPropertySetter(newPrefix + "/longDesc",
-                "longDescription");
-        digester.addBeanPropertySetter(newPrefix + "/tagHandler");
-        
-        AttributeMeta.addXmlRules(digester, newPrefix);
-    }
-
-    /**
-     * Constructor.
-     */
-    public TagMeta()
-    {
-        super("tag");
-        _attributes = new LinkedHashMap();
-    }
-
-    /**
-     * Merge the data in the specified other property into this one, throwing an
-     * exception if there is an incompatibility.
-     */
-    public void merge(TagMeta other)
-    {
-        _name = ModelUtils.merge(this._name, other._name);
-        _description = ModelUtils.merge(this._description, other._description);
-        _longDescription = ModelUtils.merge(this._longDescription,
-                other._longDescription);
-        _bodyContent = ModelUtils.merge(this._bodyContent, other._bodyContent);
-        _tagHandler = ModelUtils.merge(this._tagHandler, other._tagHandler);
-        //TODO: Merge attributes
-    }
-    
-    /**
-     * Sets the brief description of this property.
-     * <p>
-     * This description is used in tooltips, etc.
-     */
-    public void setDescription(String description)
-    {
-        _description = description;
-    }
-
-    public String getDescription()
-    {
-        return _description;
-    }
-
-    /**
-     * Sets the long description of this property.
-     */
-    public void setLongDescription(String longDescription)
-    {
-        _longDescription = longDescription;
-    }
-
-    public String getLongDescription()
-    {
-        return _longDescription;
-    }
-        
-    public void setBodyContent(String bodyContent)
-    {
-        this._bodyContent = bodyContent;
-    }
-
-    public String getBodyContent()
-    {
-        return _bodyContent;
-    }
-    
-    /**
-     * Sets the name that the user will refer to instances of this component by.
-     * <p>
-     * In JSP tags, this value will be used as the JSP tag name.
-     * <p>
-     * This property is optional; if not set then this Model instance represents
-     * a base class that components can be derived from, but which cannot itself
-     * be instantiated as a component.
-     */
-    public void setName(String name)
-    {
-        _name = name;
-    }
-
-    public String getName()
-    {
-        return _name;
-    }
-    
-    /**
-     * Specifies the class of the Facelets tag handler (component handler) for
-     * this component.
-     * <p>
-     * Note that a Facelets tag handler class is not needed for most components.
-     */
-    public void setTagHandler(String tagHandler)
-    {
-        _tagHandler = tagHandler;
-    }
-
-    public String getTagHandler()
-    {
-        return _tagHandler;
-    }
-    
-    /**
-     * Adds a property to this component.
-     */
-    public void addAttribute(AttributeMeta attribute)
-    {
-        _attributes.put(attribute.getName(), attribute);
-    }
-
-    public AttributeMeta getAttribute(String attributeName)
-    {
-        return (AttributeMeta) _attributes.get(attributeName);
-    }
-
-    /**
-     * Number of properties for this component
-     */
-    public int attributesSize()
-    {
-        return _attributes.size();
-    }
-
-    /**
-     * Returns true if this component has any properties.
-     */
-    public boolean hasAttributes()
-    {
-        return _attributes.size() > 0;
-    }
-
-    /**
-     * Returns an iterator for all properties
-     */
-    public Iterator attributes()
-    {
-        return _attributes.values().iterator();
-    }
-    
-    //THIS METHODS ARE USED FOR VELOCITY TO GET DATA AND GENERATE CLASSES
-    
-    public Collection getAttributeList()
-    {
-        return _attributes.values();
-    }
-
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ValidatorMeta.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ValidatorMeta.java
deleted file mode 100644
index 2dc3a5a..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ValidatorMeta.java
+++ /dev/null
@@ -1,336 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.commons.digester.Digester;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.io.XmlWriter;
-
-/**
- * Store metadata about a class that is either a JSF Validator, or some base
- * class or interface that a Validator can be derived from.
- */
-public class ValidatorMeta extends ViewEntityMeta implements PropertyHolder
-{
-    private String _validatorId;
-    private int _validatorClassModifiers;
-    
-    private String _bodyContent;
-    private String _tagClass;
-    private String _tagSuperclass;
-    private String _serialuidtag;
-    
-    private Boolean _generatedComponentClass;
-    private Boolean _generatedTagClass;
-    private Boolean _configExcluded;
-
-    /**
-     * Write an instance of this class out as xml.
-     */
-    protected void writeXmlSimple(XmlWriter out)
-    {
-        super.writeXmlSimple(out);
-
-        out.writeElement("validatorId", _validatorId);
-        out.writeElement("bodyContent", _bodyContent);
-        out.writeElement("tagClass", _tagClass);
-        out.writeElement("tagSuperclass", _tagSuperclass);
-        out.writeElement("serialuidtag", _serialuidtag);
-        out.writeElement("generatedComponentClass", _generatedComponentClass);
-        out.writeElement("generatedTagClass", _generatedTagClass);
-        out.writeElement("configExcluded", _configExcluded);
-    }
-
-    /**
-     * Add digester rules to repopulate an instance of this type from an xml
-     * file.
-     */
-    public static void addXmlRules(Digester digester, String prefix)
-    {
-        String newPrefix = prefix + "/validator";
-
-        digester.addObjectCreate(newPrefix, ValidatorMeta.class);
-        digester.addSetNext(newPrefix, "addValidator");
-
-        ViewEntityMeta.addXmlRules(digester, newPrefix);
-
-        digester.addBeanPropertySetter(newPrefix + "/validatorId");
-        digester.addBeanPropertySetter(newPrefix + "/bodyContent");
-        digester.addBeanPropertySetter(newPrefix + "/tagClass");
-        digester.addBeanPropertySetter(newPrefix + "/tagSuperclass");
-        digester.addBeanPropertySetter(newPrefix + "/serialuidtag");
-        digester.addBeanPropertySetter(newPrefix + "/generatedComponentClass");
-        digester.addBeanPropertySetter(newPrefix + "/generatedTagClass");
-        digester.addBeanPropertySetter(newPrefix + "/configExcluded");
-    }
-    
-    public ValidatorMeta()
-    {
-        super("validator");
-    }
-
-    /**
-     * Merge the data in the specified other property into this one, throwing an
-     * exception if there is an incompatibility.
-     * 
-     * Not used right now since theorically there is very few inheritance
-     * on converters
-     * 
-     */
-    public void merge(ValidatorMeta other)
-    {
-        super.merge(other);
-
-        _bodyContent = ModelUtils.merge(this._bodyContent, other._bodyContent);
-
-        // inheritParentTag is true if the tag class to be generated for this
-        // artifact extends the tag class generated for the parent artifact.
-        // In this case, the tag for this class already inherits setter methods
-        // from its parent that handle all the inherited properties, so the
-        // tag class for this component just needs to handle its own properties.
-        //
-        // But when the tag class for this component does not extend the tag class
-        // for the parent component (because the parent component does not have
-        // a tag class) then we need to 
-        boolean inheritParentTag = false;
-        if (other._tagClass != null)
-        {
-            //The tagSuperclass is the tagClass of the parent
-            _tagSuperclass = ModelUtils.merge(this._tagSuperclass,
-                    other._tagClass);
-            inheritParentTag = true;
-        }
-        else
-        {
-            //The tagSuperclass is the tagSuperclass of the parent
-            _tagSuperclass = ModelUtils.merge(this._tagSuperclass,
-                    other._tagSuperclass);            
-        }
-
-        
-        _validatorId = ModelUtils.merge(this._validatorId, other._validatorId);
-
-        // TODO: _validatorClassMOdifiers
-        
-        if (inheritParentTag)
-        {
-            for (Iterator i = this.properties(); i.hasNext();)
-            {
-                PropertyMeta srcProp = (PropertyMeta) i.next();
-                PropertyMeta parentProp = other.getProperty(srcProp.getName());
-                if (parentProp != null)
-                {
-                    //There are three possible behaviors:
-                    //1. The property is defined on the child again and
-                    //   the property was already on the tag hierarchy, so
-                    //   inheritedTag must be set to TRUE.
-                    //2. The property is defined on the child again and
-                    //   it is necessary to write again on the generated
-                    //   tag, so the annotation looks like
-                    //   "@JSFProperty inheritedTag=false"
-                    //   This condition must remain as FALSE
-                    //3. The property is set by the user as true, but there
-                    //   was not defined previously on the hierarchy, so
-                    //   this condition must be as is (TRUE) 
-                    //   (skipped on parentProp != null).
-                    if (srcProp.isLocalInheritedTag() == null ||
-                            srcProp.isInheritedTag().booleanValue())
-                    {
-                        srcProp.setInheritedTag(Boolean.TRUE);
-                    }
-                }
-            }
-            _propertyTagList = null;
-        }        
-    }
-
-    /**
-     * Sets the validator identifer for this component.
-     */
-    public void setValidatorId(String validatorId)
-    {
-        _validatorId = validatorId;
-    }
-
-    public String getValidatorId()
-    {
-        return _validatorId;
-    }
-
-    /**
-     * Adds a Java Language class modifier to the validator class.
-     * <p>
-     * TODO: what is this for?
-     */
-    public void addValidatorClassModifier(int modifier)
-    {
-        _validatorClassModifiers |= modifier;
-    }
-
-    /**
-     * Returns the Java Language class modifiers for the validator class. By
-     * default, these modifiers include Modifier.PUBLIC.
-     * 
-     * @return the Java Language class modifiers for the validator class
-     */
-    public int getValidatorClassModifiers()
-    {
-        int modifiers = _validatorClassModifiers;
-
-        if (!Modifier.isPrivate(modifiers) && !Modifier.isProtected(modifiers)
-                && !Modifier.isPublic(modifiers))
-        {
-            modifiers |= Modifier.PUBLIC;
-        }
-
-        return modifiers;
-    }
-    
-    public void setBodyContent(String bodyContent)
-    {
-        this._bodyContent = bodyContent;
-    }
-
-    public String getBodyContent()
-    {
-        return _bodyContent;
-    }
-
-    /**
-     * Sets the JSP tag handler class for this component.
-     */
-    public void setTagClass(String tagClass)
-    {
-        _tagClass = tagClass;
-    }
-
-    public String getTagClass()
-    {
-        return _tagClass;
-    }
-
-    /**
-     * Sets the JSP tag handler superclass for this component.
-     */
-    public void setTagSuperclass(String tagSuperclass)
-    {
-        _tagSuperclass = tagSuperclass;
-    }
-
-    public String getTagSuperclass()
-    {
-        return _tagSuperclass;
-    }
-    
-    public void setSerialuidtag(String serialuidtag)
-    {
-        _serialuidtag = serialuidtag;
-    }
-
-    public String getSerialuidtag()
-    {
-        return _serialuidtag;
-    }
-    
-    public void setGeneratedComponentClass(Boolean generatedComponentClass)
-    {
-        _generatedComponentClass = generatedComponentClass;
-    }
-
-    public Boolean isGeneratedComponentClass()
-    {
-        return ModelUtils.defaultOf(_generatedComponentClass,false);
-    }
-
-    public void setGeneratedTagClass(Boolean generatedTagClass)
-    {
-        _generatedTagClass = generatedTagClass;
-    }
-
-    public Boolean isGeneratedTagClass()
-    {
-        return ModelUtils.defaultOf(_generatedTagClass,false);
-    }
-    
-    public void setConfigExcluded(Boolean configExcluded)
-    {
-        _configExcluded = configExcluded;
-    }
-
-    public Boolean isConfigExcluded()
-    {
-        return ModelUtils.defaultOf(_configExcluded,false);
-    }    
-
-    //THIS METHODS ARE USED FOR VELOCITY TO GET DATA AND GENERATE CLASSES
-
-    // A transient attribute that is computed on-demand from the model data
-    // but is not itself stored in the model.
-    //
-    // It holds a list of all the properties which need to be implemented
-    // on the tag class. This is a subset of the properties available on
-    // this component itself, and depends upon what the parent class
-    // of the generated tag already supports.
-    private List _propertyTagList = null; 
-    
-    public Collection getPropertyTagList()
-    {
-        if (_propertyTagList == null)
-        {
-            _propertyTagList = new ArrayList();
-            for (Iterator it = getPropertyList().iterator(); it.hasNext();)
-            {
-                PropertyMeta prop = (PropertyMeta) it.next();
-                if (!prop.isTagExcluded().booleanValue() &&
-                        !prop.isInheritedTag().booleanValue())
-                {
-                    _propertyTagList.add(prop);
-                }
-            }
-            
-        }
-        return _propertyTagList;
-    }
-
-    private List _propertyValidatorList = null; 
-
-    public Collection getPropertyValidatorList()
-    {
-        if (_propertyValidatorList == null)
-        {
-            _propertyValidatorList = new ArrayList();
-            for (Iterator it = getPropertyList().iterator(); it.hasNext();)
-            {
-                PropertyMeta prop = (PropertyMeta) it.next();
-                if (!prop.isInherited().booleanValue() && prop.isGenerated().booleanValue())
-                {
-                    _propertyValidatorList.add(prop);
-                }
-            }
-            
-        }
-        return _propertyValidatorList;
-    }
-
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ViewEntityMeta.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ViewEntityMeta.java
deleted file mode 100644
index 0980858..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/model/ViewEntityMeta.java
+++ /dev/null
@@ -1,197 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.model;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.apache.commons.digester.Digester;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.io.XmlWriter;
-
-
-/**
- * Base class for metadata about any class whose instances can be used in a
- * JSF view.
- * <p>
- * This means Components, Converters, Validators.
- */
-public abstract class ViewEntityMeta extends ClassMeta implements PropertyHolder
-{
-    private String _name;
-    private String _description;
-    private String _longDescription;
-    private Map _properties = new LinkedHashMap();
-
-    /**
-     * Add digester rules to repopulate an instance of this type from an xml
-     * file.
-     */
-    public static void addXmlRules(Digester digester, String prefix)
-    {
-        ClassMeta.addXmlRules(digester, prefix);
-
-        digester.addBeanPropertySetter(prefix + "/name");
-        digester.addBeanPropertySetter(prefix + "/desc", "description");
-        digester.addBeanPropertySetter(prefix + "/longDesc",
-                "longDescription");
-        PropertyMeta.addXmlRules(digester, prefix);
-    }
-
-    /**
-     * Constructor.
-     */
-    public ViewEntityMeta(String xmlElementName)
-    {
-        super(xmlElementName);
-    }
-
-    /**
-     * Implement callback method to write out the "simple" properties of
-     * this class as xml.
-     */
-    protected void writeXmlSimple(XmlWriter out)
-    {
-        super.writeXmlSimple(out);
-
-        out.writeElement("name", _name);
-    }
-
-    /**
-     * Implement callback method to write out the "complex" properties of
-     * this class as xml.
-     */
-    protected void writeXmlComplex(XmlWriter out)
-    {
-        super.writeXmlComplex(out);
-        out.writeElement("desc", _description);
-        out.writeElement("longDesc", _longDescription);
-        for (Iterator i = _properties.values().iterator(); i.hasNext();)
-        {
-            PropertyMeta prop = (PropertyMeta) i.next();
-            PropertyMeta.writeXml(out, prop);
-        }
-    }
-
-    protected void merge(ViewEntityMeta other)
-    {
-        super.merge(other);
-        // name cannot be merged
-        _description = ModelUtils.merge(this._description, other._description);
-        _longDescription = ModelUtils.merge(this._longDescription,
-                other._longDescription);
-        ModelUtils.mergeProps(this, other);
-    }
-
-
-    /**
-     * Sets the name that the user will refer to instances of this component by.
-     * <p>
-     * In JSP tags, this value will be used as the JSP tag name.
-     * <p>
-     * This property is optional; if not set then this Model instance represents
-     * a base class that components can be derived from, but which cannot itself
-     * be instantiated as a component.
-     */
-    public void setName(String name)
-    {
-        _name = name;
-    }
-
-    public String getName()
-    {
-        return _name;
-    }
-
-    /**
-     * Sets the brief description of this property.
-     * <p>
-     * This description is used in tooltips, etc.
-     */
-    public void setDescription(String description)
-    {
-        _description = description;
-    }
-
-    public String getDescription()
-    {
-        return _description;
-    }
-
-    /**
-     * Sets the long description of this property.
-     */
-    public void setLongDescription(String longDescription)
-    {
-        _longDescription = longDescription;
-    }
-
-    public String getLongDescription()
-    {
-        return _longDescription;
-    }
-
-    /**
-     * Adds a property to this component.
-     */
-    public void addProperty(PropertyMeta property)
-    {
-        _properties.put(property.getName(), property);
-    }
-
-    public PropertyMeta getProperty(String propertyName)
-    {
-        return (PropertyMeta) _properties.get(propertyName);
-    }
-
-    /**
-     * Number of properties for this component
-     */
-    public int propertiesSize()
-    {
-        return _properties.size();
-    }
-
-    /**
-     * Returns true if this component has any properties.
-     */
-    public boolean hasProperties()
-    {
-        return _properties.size() > 0;
-    }
-
-    public Map getProperties()
-    {
-        return _properties;
-    }
-
-    public Collection getPropertyList()
-    {
-        return _properties.values();
-    }
-
-    /**
-     * Returns an iterator for all properties
-     */
-    public Iterator properties()
-    {
-        return _properties.values().iterator();
-    }
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java
deleted file mode 100644
index b44b512..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilder.java
+++ /dev/null
@@ -1,1763 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.qdox;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.IOUtils;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.ModelBuilder;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.AttributeMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ClassMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ComponentMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ConverterMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.FacetHolder;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.FacetMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.MethodSignatureMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.PropertyHolder;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.PropertyMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.RenderKitMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.RendererMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.TagMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ValidatorMeta;
-import org.codehaus.plexus.components.io.fileselectors.FileInfo;
-import org.codehaus.plexus.components.io.fileselectors.FileSelector;
-import org.codehaus.plexus.components.io.fileselectors.IncludeExcludeFileSelector;
-
-import com.thoughtworks.qdox.JavaDocBuilder;
-import com.thoughtworks.qdox.model.AbstractJavaEntity;
-import com.thoughtworks.qdox.model.Annotation;
-import com.thoughtworks.qdox.model.DocletTag;
-import com.thoughtworks.qdox.model.JavaClass;
-import com.thoughtworks.qdox.model.JavaField;
-import com.thoughtworks.qdox.model.JavaMethod;
-import com.thoughtworks.qdox.model.Type;
-
-/**
- * An implementation of the ModelBuilder interface that uses the Qdox java
- * source-parsing library to scan a list of specified source directories for
- * java files.
- * <p>
- * The java source files found can use either java15 annotations or doclet
- * annotations to indicate what data should be added to the Model.
- */
-public class QdoxModelBuilder implements ModelBuilder
-{
-    private final Log log = LogFactory.getLog(QdoxModelBuilder.class);
-
-    private static final String DOC_CONVERTER = "JSFConverter";
-    private static final String DOC_VALIDATOR = "JSFValidator";
-    private static final String DOC_COMPONENT = "JSFComponent";
-    private static final String DOC_RENDERER = "JSFRenderer";
-    private static final String DOC_RENDERKIT = "JSFRenderKit";
-    private static final String DOC_RENDERERS = "JSFRenderers";
-
-    private static final String DOC_PROPERTY = "JSFProperty";
-    private static final String DOC_FACET = "JSFFacet";   
-    
-    //This property is used in special cases where properties 
-    //does not have methods defined on component class, like binding
-    //in jsf 1.1 (in 1.2 has component counterpart). In fact, all
-    //properties must be defined with JSFProperty
-    private static final String DOC_JSP_PROPERTY = "JSFJspProperty";
-    private static final String DOC_JSP_PROPERTIES = "JSFJspProperties";
-    
-    private static final String DOC_TAG = "JSFJspTag";
-    private static final String DOC_JSP_ATTRIBUTE = "JSFJspAttribute";
-
-    private static class JavaClassComparator implements Comparator
-    {
-        public int compare(Object arg0, Object arg1)
-        {
-            JavaClass c0 = (JavaClass) arg0;
-            JavaClass c1 = (JavaClass) arg1;
-
-            return (c0.getFullyQualifiedName().compareTo(c1.getFullyQualifiedName()));
-        }
-    }
-
-    /**
-     * Scan the source tree for doc-annotations, and build Model objects
-     * containing info extracted from the doc-annotation attributes and
-     * introspected info about the item the annotation is attached to.
-     */
-    public void buildModel(Model model, MavenProject project)
-            throws MojoExecutionException
-    {
-        buildModel(model, project.getCompileSourceRoots());
-    }
-    
-    /**
-     * @since 1.0.2
-     */
-    public void buildModel(Model model, MavenProject project, String includes, String excludes)
-        throws MojoExecutionException
-    {
-        if (StringUtils.isNotEmpty(includes) || 
-                StringUtils.isNotEmpty(excludes))
-        {
-            buildModel(model, project.getCompileSourceRoots(),includes, excludes);            
-        }
-        else
-        {
-            buildModel(model, project.getCompileSourceRoots());
-        }
-    }
-    
-    /**
-     * @since 1.0.2
-     */
-    public void buildModel(Model model, List sourceDirs, String includes, String excludes)
-        throws MojoExecutionException
-    {
-        String currModelId = model.getModelId();
-        if (currModelId == null)
-        {
-            throw new MojoExecutionException("Model must have id set");
-        }
-        //System.out.println("includes:"+includes+" excludes:"+excludes);
-
-        JavaDocBuilder builder = new JavaDocBuilder();
-
-        IncludeExcludeFileSelector selector = 
-            new IncludeExcludeFileSelector(); 
-    
-        if (StringUtils.isNotEmpty(excludes))
-        {
-            selector.setExcludes(excludes.split(","));
-        }
-        if (StringUtils.isNotEmpty(includes))
-        {
-            selector.setIncludes(includes.split(","));            
-        }
-        
-        for (Iterator i = sourceDirs.iterator(); i.hasNext();)
-        {
-            File srcDir = new File((String) i.next());
-            
-            //Scan all files on directory and add to builder
-            addFileToJavaDocBuilder(builder, selector, srcDir);
-        }        
-        
-        JavaClass[] classes = builder.getClasses();
-        
-        buildModel(model, sourceDirs, classes);
-    }
-    
-    private void addFileToJavaDocBuilder(JavaDocBuilder builder,
-            FileSelector selector, File path)
-    {
-        addFileToJavaDocBuilder(builder,selector, path, path.getPath());
-    }
-    
-    
-    private void addFileToJavaDocBuilder(JavaDocBuilder builder,
-            FileSelector selector, File path, String basePath)
-    {
-        if (path.isDirectory())
-        {
-            File[] files = path.listFiles();
-            
-            //Scan all files in directory
-            for (int i = 0; i < files.length; i++)
-            {
-                addFileToJavaDocBuilder(builder, selector, files[i], basePath);
-            }
-        }
-        else
-        {
-            File file = path;
-
-            try
-            {
-                String name = file.getPath();
-                while (name.startsWith("/"))
-                {
-                    name = name.substring(1);
-                }
-                while (name.startsWith("\\"))
-                {
-                    name = name.substring(1);
-                }
-                SourceFileInfo fileInfo = new SourceFileInfo(file,name);
-                if (selector.isSelected(fileInfo))
-                {
-                    //System.out.println("file:"+name);
-                    builder.addSource(file);
-                }
-            }
-            catch (FileNotFoundException e)
-            {
-                log.error("Error reading file: "+file.getName()+" "+e.getMessage());
-            }
-            catch (IOException e)
-            {
-                log.error("Error reading file: "+file.getName()+" "+e.getMessage());                
-            }
-        }
-    }
-    
-    private class SourceFileInfo implements FileInfo
-    {
-        private File file;
-        
-        private String name;
-
-        /**
-         * Creates a new instance.
-         */
-        public SourceFileInfo( File file )
-        {
-            this( file, file.getPath().replace( '\\', '/' ) );
-        }
-
-        /**
-         * Creates a new instance.
-         */
-        public SourceFileInfo( File file, String name )
-        {
-            this.file = file;
-            this.name = name;
-        }
-        
-        /**
-         * Sets the resources file.
-         */
-        public void setFile( File file )
-        {
-            this.file = file;
-        }
-
-        /**
-         * Returns the resources file.
-         */
-        public File getFile()
-        {
-            return file;
-        }
-
-        /**
-         * Sets the resources name.
-         */
-        public void setName( String name )
-        {
-            this.name = name;
-        }
-
-        public String getName()
-        {
-            return name;
-        }        
-        
-        public InputStream getContents() throws IOException
-        {
-            return new FileInputStream( getFile() );
-        }
-
-        public boolean isDirectory()
-        {
-            return file.isDirectory();
-        }
-
-        public boolean isFile()
-        {
-            return file.isFile();
-        }        
-    }
-
-    /**
-     * Scan the source tree for doc-annotations, and build Model objects
-     * containing info extracted from the doc-annotation attributes and
-     * introspected info about the item the annotation is attached to.
-     */
-    public void buildModel(Model model, List sourceDirs)
-            throws MojoExecutionException
-    {
-        String currModelId = model.getModelId();
-        if (currModelId == null)
-        {
-            throw new MojoExecutionException("Model must have id set");
-        }
-
-        JavaDocBuilder builder = new JavaDocBuilder();
-
-        // need a File object representing the original source tree
-        //
-        // TODO: make this more flexible, so specific classes can
-        // be included and excluded.
-        for (Iterator i = sourceDirs.iterator(); i.hasNext();)
-        {
-            String srcDir = (String) i.next();
-            builder.addSourceTree(new File(srcDir));
-        }
-
-        JavaClass[] classes = builder.getClasses();
-
-        buildModel(model, sourceDirs, classes);
-    }
-    
-    protected void buildModel(Model model, List sourceDirs, JavaClass[] classes)
-        throws MojoExecutionException
-    {
-        String currModelId = model.getModelId();
-
-        // Sort the class array so that they are processed in a
-        // predictable order, regardless of how the source scanning
-        // returned them.
-        Arrays.sort(classes, new JavaClassComparator());
-        Map processedClasses = new HashMap();
-        for (int i = 0; i < classes.length; ++i)
-        {
-            JavaClass clazz = classes[i];
-            processClass(processedClasses, clazz, model);
-        }
-
-        // Post-process the list of components which we added in this run.
-        // Note that model has all the inherited components in it too, so
-        // we need to skip them.
-        //
-        // Hmm..as noted elsewhere, JavaClass objects representing parent
-        // classes are accessable via getParentClazz(). Presumably they are
-        // not in the array returned by builder.getClasses() though..
-        for (Iterator it = model.getComponents().iterator(); it.hasNext();)
-        {
-            ComponentMeta component = (ComponentMeta) it.next();
-            if (!component.getModelId().equals(currModelId))
-            {
-                continue;
-            }
-            initComponentAncestry(processedClasses, model, component);
-
-            //Check if the component class java file exists in the source dirs
-            String classname = component.getClassName();
-            String classfile = StringUtils.replace(classname,".","/")+".java";
-            if (!IOUtils.existsSourceFile(classfile, sourceDirs))
-            {
-                component.setGeneratedComponentClass(Boolean.TRUE);
-            }
-
-            // Check if the tag class java file exists in the source dirs
-            if (isTagClassMissing(component.getTagClass(), sourceDirs))
-            {
-                component.setGeneratedTagClass(Boolean.TRUE);
-            }
-        }
-
-        // post-process the list of converters
-        for (Iterator it = model.getConverters().iterator(); it.hasNext();)
-        {
-            ConverterMeta converter = (ConverterMeta) it.next();
-            if (!converter.getModelId().equals(currModelId))
-            {
-                continue;
-            }
-            initConverterAncestry(processedClasses, model, converter);
-            // TODO: why is there no check for Converter class existence here??
-            // ANS: there is no automatic generation of converter class.
-            
-            // Check if the tag class java file exists in the source dirs
-            if (isTagClassMissing(converter.getTagClass(), sourceDirs))
-            {
-                converter.setGeneratedTagClass(Boolean.TRUE);
-            }
-        }
-
-        // post-process the list of validators
-        for (Iterator it = model.getValidators().iterator(); it.hasNext();)
-        {
-            ValidatorMeta validator = (ValidatorMeta) it.next();
-            if (!validator.getModelId().equals(currModelId))
-            {
-                continue;
-            }
-            initValidatorAncestry(processedClasses, model, validator);
-            
-            //Check if the validator class file exists
-            if (!IOUtils.existsSourceFile(StringUtils.replace(
-                    validator.getClassName(),".","/")+".java", sourceDirs))
-            {
-                validator.setGeneratedComponentClass(Boolean.TRUE);
-            }
-
-            // Check if the tag class java file exists in the source dirs
-            if (isTagClassMissing(validator.getTagClass(), sourceDirs))
-            {
-                validator.setGeneratedTagClass(Boolean.TRUE);
-            }
-        }
-
-        // post-process the list of tags
-        for (Iterator it = model.getTags().iterator(); it.hasNext();)
-        {
-            TagMeta tag = (TagMeta) it.next();
-            // nothing to do at the moment 
-        }       
-
-    }
-
-    /**
-     * Returns true if the tagClassName is not null, but the corresponding
-     * source file cannot be found in the specified source dirs.
-     */
-    private boolean isTagClassMissing(String tagClassName, List sourceDirs)
-    {
-        if (tagClassName == null)
-        {
-            return false;
-        }
-        String tagClassFile = StringUtils.replace(tagClassName,".","/")+".java";
-        return !IOUtils.existsSourceFile(tagClassFile, sourceDirs);
-    }
-
-    /**
-     * Set the parentClassName and interfaceClassNames properties of the
-     * provided modelItem object.
-     */
-    private void processClass(Map processedClasses, JavaClass clazz, Model model)
-            throws MojoExecutionException
-    {
-        if (processedClasses.containsKey(clazz.getFullyQualifiedName()))
-        {
-            return;
-        }
-
-        // first, check that the parent type and all interfaces have been
-        // processed.
-        JavaClass parentClazz = clazz.getSuperJavaClass();
-        if (parentClazz != null)
-        {
-            processClass(processedClasses, parentClazz, model);
-        }
-
-        JavaClass[] classes = clazz.getImplementedInterfaces();
-        for (int i = 0; i < classes.length; ++i)
-        {
-            JavaClass iclazz = classes[i];
-            processClass(processedClasses, iclazz, model);
-        }
-
-        // ok, now we can mark this class as processed.
-        processedClasses.put(clazz.getFullyQualifiedName(), clazz);
-
-        log.info("processed class:" + clazz.getFullyQualifiedName());
-
-        DocletTag tag;
-        Annotation anno;
-
-        // converters
-        tag = clazz.getTagByName(DOC_CONVERTER, false);
-        if (tag != null)
-        {
-            Map props = tag.getNamedParameterMap();
-            processConverter(props, (AbstractJavaEntity)tag.getContext(), clazz, model);
-        }
-        anno = getAnnotation(clazz, DOC_CONVERTER);
-        if (anno != null)
-        {
-            Map props = anno.getNamedParameterMap();
-            processConverter(props, (AbstractJavaEntity)anno.getContext(), clazz, model);
-        }
-
-        // validators
-        tag = clazz.getTagByName(DOC_VALIDATOR, false);
-        if (tag != null)
-        {
-            Map props = tag.getNamedParameterMap();
-            processValidator(props, (AbstractJavaEntity)tag.getContext(), clazz, model);
-        }
-        anno = getAnnotation(clazz, DOC_VALIDATOR);
-        if (anno != null)
-        {
-            Map props = anno.getNamedParameterMap();
-            processValidator(props, (AbstractJavaEntity)anno.getContext(), clazz, model);
-        }
-
-        // components
-        tag = clazz.getTagByName(DOC_COMPONENT, false);
-        if (tag != null)
-        {
-            Map props = tag.getNamedParameterMap();
-            processComponent(props, (AbstractJavaEntity)tag.getContext(), clazz, model);
-        }
-        anno = getAnnotation(clazz, DOC_COMPONENT);
-        if (anno != null)
-        {
-            Map props = anno.getNamedParameterMap();
-            processComponent(props, (AbstractJavaEntity)anno.getContext(), clazz, model);
-        }
-        
-        //tag
-        tag = clazz.getTagByName(DOC_TAG, false);
-        if (tag != null)
-        {
-            Map props = tag.getNamedParameterMap();
-            processTag(props, (AbstractJavaEntity)tag.getContext(), clazz, model);
-        }
-        anno = getAnnotation(clazz, DOC_TAG);
-        if (anno != null)
-        {
-            Map props = anno.getNamedParameterMap();
-            processTag(props, (AbstractJavaEntity)anno.getContext(), clazz, model);
-        }
-        
-        // renderKit
-        tag = clazz.getTagByName(DOC_RENDERKIT, false);
-        if (tag != null)
-        {
-            Map props = tag.getNamedParameterMap();
-            processRenderKit(props, (AbstractJavaEntity)tag.getContext(), clazz, model);
-        }
-        anno = getAnnotation(clazz, DOC_RENDERKIT);
-        if (anno != null)
-        {
-            Map props = anno.getNamedParameterMap();
-            processRenderKit(props, (AbstractJavaEntity)anno.getContext(), clazz, model);
-        }
-                
-        // renderer
-        DocletTag [] tags = clazz.getTagsByName(DOC_RENDERER, false);
-        
-        for (int i = 0; i < tags.length; i++)
-        {
-            tag = tags[i];
-            if (tag != null)
-            {
-                Map props = tag.getNamedParameterMap();
-                processRenderer(props, (AbstractJavaEntity)tag.getContext(), clazz, model);
-            }
-        }
-        
-        anno = getAnnotation(clazz, DOC_RENDERER);
-        if (anno != null)
-        {
-            Map props = anno.getNamedParameterMap();
-            processRenderer(props, (AbstractJavaEntity)anno.getContext(), clazz, model);
-        }
-        
-        anno = getAnnotation(clazz, DOC_RENDERERS);
-        if (anno != null)
-        {
-            Object jspProps = anno.getNamedParameter("renderers");
-            
-            if (jspProps instanceof Annotation)
-            {
-                Annotation jspPropertiesAnno = (Annotation) jspProps;
-                Map props = jspPropertiesAnno.getNamedParameterMap();
-                processRenderer(props, (AbstractJavaEntity)anno.getContext(), clazz, model);
-            }
-            else
-            {
-                List jspPropsList = (List) jspProps;
-                for (int i = 0; i < jspPropsList.size();i++)
-                {
-                    Annotation ranno = (Annotation) jspPropsList.get(i);
-                    
-                    Map props = ranno.getNamedParameterMap();
-                    processRenderer(props, (AbstractJavaEntity)anno.getContext(), clazz, model);
-                }
-            }
-        }
-    }
-
-    private Annotation getAnnotation(AbstractJavaEntity entity, String annoName)
-    {
-        Annotation[] annos = entity.getAnnotations();
-        if (annos == null)
-        {
-            return null;
-        }
-        // String wanted = ANNOTATION_BASE + "." + annoName;
-        for (int i = 0; i < annos.length; ++i)
-        {
-            Annotation thisAnno = annos[i];
-            // Ideally, here we would check whether the fully-qualified name of
-            // the annotation
-            // class matches ANNOTATION_BASE + "." + annoName. However it
-            // appears that qdox 1.6.3
-            // does not correctly expand @Foo using the class import statements;
-            // method
-            // Annotation.getType.getJavaClass.getFullyQualifiedName still just
-            // returns the short
-            // class name. So for now, just check for the short name.
-            String thisAnnoName = thisAnno.getType().getJavaClass().getName();
-            
-            //Make short name for recognizing, if returns long
-            int containsPoint = thisAnnoName.lastIndexOf('.');
-            if (containsPoint != -1)
-            {
-                thisAnnoName = thisAnnoName.substring(containsPoint+1);
-            }
-            if (thisAnnoName.equals(annoName))
-            {
-                return thisAnno;
-            }
-        }
-        return null;
-    }
-    
-    
-    private String getFullyQualifiedClassName(JavaClass clazz, String fqn)
-    {
-        //QDox 1.9 bug. getFullyQualifiedName does not resolve 
-        //correctly classes like javax.servlet.jsp.tagext.TagSupport as parent
-        //of a class with @JSFJspTag. The temporal solution is scan
-        //the imports, looking for this type and if it is found replace it.
-        //Fixed on 1.9.1, but better let the code as is 
-        /*
-        if (fqn.indexOf('.') == -1)
-        {
-            String [] imports = clazz.getSource().getImports();
-            for (int i = 0; i < imports.length; i++)
-            {
-                if (imports[i].endsWith(fqn))
-                {
-                    fqn = imports[i];
-                }
-            }
-        }*/
-        return fqn;
-    }
-
-    /**
-     * Remove all leading whitespace and a quotemark if it exists.
-     * <p>
-     * Qdox comments like <code>foo val= "bar"</code> return a value with
-     * leading whitespace and quotes, so remove them.
-     */
-    private String clean(Object srcObj)
-    {
-        if (srcObj == null)
-        {
-            return null;
-        }
-
-        String src = srcObj.toString();
-        int start = 0;
-        int end = src.length();
-        
-        if (end == 0)
-        {
-            return src;
-        }
-        
-        if (src.equals("\"\""))
-        {
-            return "\"\"";
-        }
-
-        while (start <= end)
-        {
-            char c = src.charAt(start);
-            if (!Character.isWhitespace(c) && (c != '"'))
-            {
-                break;
-            }
-            ++start;
-        }
-        while (end >= start)
-        {
-            char c = src.charAt(end - 1);
-            if (!Character.isWhitespace(c) && (c != '"'))
-            {
-                break;
-            }
-            --end;
-        }
-        return src.substring(start, end);
-    }
-
-    /**
-     * Get the named attribute from a doc-annotation.
-     * 
-     * Param clazz is the class the annotation is attached to; only used when
-     * reporting errors.
-     */
-    private String getString(JavaClass clazz, String key, Map map, String dflt)
-    {
-        String val = clean(map.get(key));
-        if (val != null)
-        {
-            return val;
-        }
-        else
-        {
-            return dflt;
-        }
-    }
-
-    /**
-     * Get the named attribute from a doc-annotation and convert to a boolean.
-     * 
-     * Param clazz is the class the annotation is attached to; only used when
-     * reporting errors.
-     */
-    private Boolean getBoolean(JavaClass clazz, String key, Map map,
-            Boolean dflt)
-    {
-        String val = clean(map.get(key));
-        if (val == null)
-        {
-            return dflt;
-        }
-        // TODO: report problem if the value does not look like "true" or
-        // "false",
-        // rather than silently converting it to false.
-        return Boolean.valueOf(val);
-    }
-
-    /**
-     * Set the basic data on a ClassMeta.
-     * <p>
-     * There is one property not set here: the parentClassName. See method
-     * initComponentAncestry for further details.
-     */
-    private void initClassMeta(Model model, JavaClass clazz,
-            ClassMeta modelItem, String classNameOverride)
-    {
-        modelItem.setModelId(model.getModelId());
-        modelItem.setSourceClassName(clazz.getFullyQualifiedName());
-        JavaClass realParentClass = clazz.getSuperJavaClass();
-        if (realParentClass != null)
-        {
-            String fqn = realParentClass.getFullyQualifiedName();
-            
-            if ((fqn != null) && !fqn.startsWith("java.lang"))
-            {
-                fqn = getFullyQualifiedClassName(clazz,fqn);
-                modelItem.setSourceClassParentClassName(fqn);
-            }
-        }
-
-        // JSF Entity class.
-        if (StringUtils.isEmpty(classNameOverride))
-        {
-            modelItem.setClassName(clazz.getFullyQualifiedName());
-        }
-        else
-        {
-            modelItem.setClassName(classNameOverride);
-        }
-
-        // interfaces metadata is inherited from
-        JavaClass[] classes = clazz.getImplementedInterfaces();
-        List ifaceNames = new ArrayList();
-        for (int i = 0; i < classes.length; ++i)
-        {
-            JavaClass iclazz = classes[i];
-
-            ComponentMeta ifaceComponent = model
-                    .findComponentByClassName(iclazz.getFullyQualifiedName());
-            if (ifaceComponent != null)
-            {
-                ifaceNames.add(ifaceComponent.getClassName());
-            }
-        }
-        modelItem.setInterfaceClassNames(ifaceNames);
-    }
-
-    /**
-     * For each component, try to find its "logical" parent component,
-     * ie the nearest superclass that is also annotated as a component
-     * and therefore has an entry in the model.
-     * <p>
-     * In most cases this could be done at the time the component is
-     * processed. The processClass() method does try to process the
-     * classes that qdox discovers in ancestor->descendant order.
-     * <p>
-     * However there is one case where this just doesn't work. Therefore
-     * a two-pass approach is used: first create a ComponentMeta for
-     * each component, and then on a second pass find the matching
-     * parent for each one.
-     * <p>
-     * The problem case is where an annotated java class extends a
-     * generated one. In this case when walking up the ancestry tree of
-     * the hand-written class we find an entry for which there is no
-     * ComponentMeta entry. We do not know whether this is because the
-     * parent exists but is not annotated, or whether a ComponentMeta
-     * for that parent will be generated once we have processed some
-     * other class that happens to have the matching annotation.
-     */
-    private void initComponentAncestry(Map javaClassByName, Model model, ClassMeta modelItem)
-    {
-        JavaClass clazz = (JavaClass) javaClassByName.get(modelItem.getSourceClassName());
-        JavaClass parentClazz = clazz.getSuperJavaClass();
-        while (parentClazz != null)
-        {
-            String parentClazzName = parentClazz.getFullyQualifiedName();
-            
-            parentClazzName = getFullyQualifiedClassName(clazz,parentClazzName);
-            
-            ComponentMeta parentComponent = model
-                    .findComponentByClassName(parentClazzName);
-            if (parentComponent != null)
-            {
-                modelItem.setParentClassName(parentComponent.getClassName());
-                break;
-            }
-            parentClazz = parentClazz.getSuperJavaClass();
-        }
-    }
-
-    /**
-     * Same as initComponentAncestry but for validators.
-     */
-    private void initValidatorAncestry(Map javaClassByName, Model model, ClassMeta modelItem)
-    {
-        JavaClass clazz = (JavaClass) javaClassByName.get(modelItem.getSourceClassName());
-        JavaClass parentClazz = clazz.getSuperJavaClass();
-        while (parentClazz != null)
-        {
-            String parentClazzName = parentClazz.getFullyQualifiedName();
-            
-            parentClazzName = getFullyQualifiedClassName(clazz,parentClazzName);
-
-            ValidatorMeta parentComponent = model
-                    .findValidatorByClassName(parentClazzName);
-            if (parentComponent != null)
-            {
-                modelItem.setParentClassName(parentComponent.getClassName());
-                break;
-            }
-            parentClazz = parentClazz.getSuperJavaClass();
-        }
-    }
-    
-    /**
-     * Same as initComponentAncestry but for converters
-     */
-    private void initConverterAncestry(Map javaClassByName, Model model, ClassMeta modelItem)
-    {
-        JavaClass clazz = (JavaClass) javaClassByName.get(modelItem.getSourceClassName());
-        JavaClass parentClazz = clazz.getSuperJavaClass();
-        while (parentClazz != null)
-        {
-            String parentClazzName = parentClazz.getFullyQualifiedName();
-            
-            parentClazzName = getFullyQualifiedClassName(clazz,parentClazzName);
-            
-            ConverterMeta parentComponent = model
-                    .findConverterByClassName(parentClazzName);
-            if (parentComponent != null)
-            {
-                modelItem.setParentClassName(parentComponent.getClassName());
-                break;
-            }
-            parentClazz = parentClazz.getSuperJavaClass();
-        }
-    }
-    
-    private void processConverter(Map props, AbstractJavaEntity ctx,
-            JavaClass clazz, Model model)
-    {
-        String longDescription = clazz.getComment();
-        String descDflt = getFirstSentence(longDescription);
-        if ((descDflt == null) || (descDflt.length() < 2))
-        {
-            descDflt = "no description";
-        }
-        String shortDescription = getString(clazz, "desc", props, descDflt);
-
-        String converterIdDflt = null;
-        JavaField fieldConverterId = clazz
-                .getFieldByName("CONVERTER_ID");
-        if (fieldConverterId != null)
-        {
-            String value = fieldConverterId.getInitializationExpression();
-            converterIdDflt = clean(value.substring(value.indexOf('"')));
-        }        
-        String converterId = getString(clazz, "id", props, converterIdDflt);
-
-        // Check for both "class" and "clazz" in order to support
-        // doclet and real annotations.
-        String classNameOverride = getString(clazz, "class", props, null);
-        classNameOverride = getString(clazz,"clazz",props,classNameOverride);
-        
-        String componentName = getString(clazz, "name", props, null);
-        String bodyContent = getString(clazz, "bodyContent", props, null);
-        String tagClass = getString(clazz, "tagClass", props, null);
-        String tagSuperclass = getString(clazz, "tagSuperclass", props, null);
-        String serialuidtag = getString(clazz, "serialuidtag", props, null);
-        Boolean configExcluded = getBoolean(clazz,"configExcluded",props,null);   
-
-        ConverterMeta converter = new ConverterMeta();
-        initClassMeta(model, clazz, converter, classNameOverride);
-        converter.setName(componentName);
-        converter.setBodyContent(bodyContent);
-        converter.setTagClass(tagClass);
-        converter.setTagSuperclass(tagSuperclass);
-        converter.setConverterId(converterId);
-        converter.setDescription(shortDescription);
-        converter.setLongDescription(longDescription);
-        converter.setSerialuidtag(serialuidtag);
-        converter.setConfigExcluded(configExcluded);
-        
-        // Now here walk the component looking for property annotations.
-        processComponentProperties(clazz, converter);
-        
-        model.addConverter(converter);
-    }
-        
-    private void processValidator(Map props, AbstractJavaEntity ctx,
-            JavaClass clazz, Model model)
-    {
-        String longDescription = clazz.getComment();
-        String descDflt = getFirstSentence(longDescription);
-        if ((descDflt == null) || (descDflt.length() < 2))
-        {
-            descDflt = "no description";
-        }
-        String shortDescription = getString(clazz, "desc", props, descDflt);
-
-        String validatorIdDflt = null;
-        JavaField fieldConverterId = clazz
-                .getFieldByName("VALIDATOR_ID");
-        if (fieldConverterId != null)
-        {
-            String value = fieldConverterId.getInitializationExpression();
-            validatorIdDflt = clean(value.substring(value.indexOf('"')));
-        }        
-        String validatorId = getString(clazz, "id", props, validatorIdDflt);
-
-        // Check for both "class" and "clazz" in order to support
-        // doclet and real annotations.
-        String classNameOverride = getString(clazz, "class", props, null);
-        classNameOverride = getString(clazz,"clazz",props,classNameOverride);
-        
-        String componentName = getString(clazz, "name", props, null);
-        String bodyContent = getString(clazz, "bodyContent", props, null);
-        String tagClass = getString(clazz, "tagClass", props, null);        
-        String tagSuperclass = getString(clazz, "tagSuperclass", props, null);
-        String serialuidtag = getString(clazz, "serialuidtag", props, null);
-        Boolean configExcluded = getBoolean(clazz,"configExcluded",props,null);   
-        
-        ValidatorMeta validator = new ValidatorMeta();
-        initClassMeta(model, clazz, validator, classNameOverride);
-        validator.setName(componentName);
-        validator.setBodyContent(bodyContent);
-        validator.setTagClass(tagClass);
-        validator.setTagSuperclass(tagSuperclass);
-        validator.setValidatorId(validatorId);
-        validator.setDescription(shortDescription);
-        validator.setLongDescription(longDescription);
-        validator.setSerialuidtag(serialuidtag);
-        validator.setConfigExcluded(configExcluded);
-        
-        // Now here walk the component looking for property annotations.
-        processComponentProperties(clazz, validator);
-        
-        model.addValidator(validator);
-    }
-    
-    private void processRenderKit(Map props, AbstractJavaEntity ctx,
-            JavaClass clazz, Model model)
-    {
-
-        String renderKitId = getString(clazz, "renderKitId", props, null);
-        String renderKitClass = getString(clazz, "class", props, clazz
-                .getFullyQualifiedName());
-        renderKitClass = getString(clazz,"clazz",props,renderKitClass);
-
-        RenderKitMeta renderKit = model.findRenderKitById(renderKitId);
-        
-        if (renderKit == null)
-        {
-            renderKit = new RenderKitMeta();
-            renderKit.setClassName(renderKitClass);
-            renderKit.setRenderKitId(renderKitId);
-            model.addRenderKit(renderKit);        
-        }
-        else
-        {
-            renderKit.setClassName(renderKitClass);
-            renderKit.setRenderKitId(renderKitId);            
-        }
-    }
-    
-    private void processRenderer(Map props, AbstractJavaEntity ctx,
-            JavaClass clazz, Model model)
-    {
-        String longDescription = clazz.getComment();
-        String descDflt = getFirstSentence(longDescription);
-        if ((descDflt == null) || (descDflt.length() < 2))
-        {
-            descDflt = "no description";
-        }
-        String shortDescription = getString(clazz, "desc", props, descDflt);
-   
-        String renderKitId = getString(clazz, "renderKitId", props, null);
-        String rendererClass = getString(clazz, "class", props, clazz
-                .getFullyQualifiedName());
-        rendererClass = getString(clazz,"clazz",props,rendererClass);
-        
-        String componentFamily = getString(clazz,"family", props,null);
-        String rendererType = getString(clazz,"type", props,null);
-        
-        RenderKitMeta renderKit = model.findRenderKitById(renderKitId);
-        
-        if (renderKit == null)
-        {
-            renderKit = new RenderKitMeta();
-            renderKit.setRenderKitId(renderKitId);
-            model.addRenderKit(renderKit);            
-        }
-
-        RendererMeta renderer = new RendererMeta();
-        renderer.setClassName(rendererClass);
-        renderer.setDescription(shortDescription);
-        renderer.setComponentFamily(componentFamily);
-        renderer.setRendererType(rendererType);
-        renderKit.addRenderer(renderer);
-    }
-    
-    private void processTag(Map props, AbstractJavaEntity ctx,
-            JavaClass clazz, Model model) throws MojoExecutionException
-    {
-        String longDescription = clazz.getComment();
-        String descDflt = getFirstSentence(longDescription);
-        if ((descDflt == null) || (descDflt.length() < 2))
-        {
-            descDflt = "no description";
-        }
-        String shortDescription = getString(clazz, "desc", props, descDflt);
-
-        String tagName = getString(clazz, "name", props, null);
-        String classNameOverride = getString(clazz, "class", props, null);
-        classNameOverride = getString(clazz,"clazz",props,classNameOverride);
-        
-        String bodyContent = getString(clazz, "bodyContent", props, "JSP");
-        String tagHandler = getString(clazz, "tagHandler", props, null);
-
-        TagMeta tag = new TagMeta();
-        initClassMeta(model, clazz, tag, classNameOverride);
-        tag.setName(tagName);
-        tag.setBodyContent(bodyContent);
-        tag.setDescription(shortDescription);
-        tag.setLongDescription(longDescription);
-        tag.setTagHandler(tagHandler);
-        
-        processTagAttributes(clazz, tag);
-        model.addTag(tag);
-    }
-    
-    private void processComponent(Map props, AbstractJavaEntity ctx,
-            JavaClass clazz, Model model) throws MojoExecutionException
-    {
-        String componentTypeDflt = null;
-        JavaField fieldComponentType = clazz.getFieldByName("COMPONENT_TYPE");
-        if (fieldComponentType != null)
-        {
-            componentTypeDflt = clean(fieldComponentType
-                    .getInitializationExpression());
-        }
-
-        String componentTypeFamily = null;
-        JavaField fieldComponentFamily = clazz
-                .getFieldByName("COMPONENT_FAMILY");
-        if (fieldComponentFamily != null)
-        {
-            componentTypeFamily = clean(fieldComponentFamily
-                    .getInitializationExpression());
-        }
-
-        String rendererTypeDflt = null;
-        JavaField fieldRendererType = clazz
-                .getFieldByName("DEFAULT_RENDERER_TYPE");
-        if (fieldRendererType != null)
-        {
-            rendererTypeDflt = clean(fieldRendererType
-                    .getInitializationExpression());
-        }
-
-        String componentName = getString(clazz, "name", props, null);
-
-        // Check for both "class" and "clazz" in order to support
-        // doclet and real annotations.
-        String classNameOverride = getString(clazz, "class", props, null);
-        classNameOverride = getString(clazz,"clazz",props,classNameOverride);
-                
-        Boolean template = getBoolean(clazz,"template",props, null);
-                
-        String longDescription = clazz.getComment();
-        String descDflt = getFirstSentence(longDescription);
-        if ((descDflt == null) || (descDflt.length() < 2))
-        {
-            descDflt = "no description";
-        }
-        String shortDescription = getString(clazz, "desc", props, descDflt);
-
-        String bodyContent = getString(clazz, "bodyContent", props, null);
-        
-        String componentFamily = getString(clazz, "family", props,
-                componentTypeFamily);
-        String componentType = getString(clazz, "type", props,
-                componentTypeDflt);
-        String rendererType = getString(clazz, "defaultRendererType", props,
-                rendererTypeDflt);
-        Boolean canHaveChildren = getBoolean(clazz, "canHaveChildren", props, null);
-        Boolean configExcluded = getBoolean(clazz,"configExcluded",props,null);        
-
-        String tagClass = getString(clazz, "tagClass", props, null);
-        String tagSuperclass = getString(clazz, "tagSuperclass", props, null);
-        String tagHandler = getString(clazz, "tagHandler", props, null);
-        String defaultEventName = getString(clazz, "defaultEventName", props, null);
-        String serialuid = getString(clazz, "serialuid", props, null);
-        String implementsValue = getString(clazz, "implements", props, null);
-        implementsValue = getString(clazz, "implementz", props, implementsValue);
-
-        ComponentMeta component = new ComponentMeta();
-        initClassMeta(model, clazz, component, classNameOverride);
-        component.setName(componentName);
-        component.setBodyContent(bodyContent);
-        component.setDescription(shortDescription);
-        component.setLongDescription(longDescription);
-        component.setConfigExcluded(configExcluded);
-        component.setType(componentType);
-        component.setFamily(componentFamily);
-        component.setRendererType(rendererType);
-        component.setChildren(canHaveChildren);
-        component.setSerialuid(serialuid);
-        component.setImplements(implementsValue);
-        component.setTemplate(template);
-        component.setDefaultEventName(defaultEventName);
-        
-        JavaClass[] interfaces = clazz.getImplementedInterfaces();
-        for (int i = 0; i < interfaces.length; ++i)
-        {
-            JavaClass iface = interfaces[i];
-            if (iface.getFullyQualifiedName().equals(
-                    "javax.faces.component.NamingContainer"))
-            {
-                component.setNamingContainer(Boolean.TRUE);
-                break;
-            }
-        }
-
-        component.setTagClass(tagClass);
-        component.setTagSuperclass(tagSuperclass);
-        component.setTagHandler(tagHandler);
-
-        // Now here walk the component looking for property annotations.
-        processComponentProperties(clazz, component);
-        processComponentFacets(clazz, component);
-
-        model.addComponent(component);
-    }
-
-    private void processTagAttributes(JavaClass clazz,
-            TagMeta ctag)
-    {
-        JavaMethod[] methods = clazz.getMethods();
-        for (int i = 0; i < methods.length; ++i)
-        {
-            JavaMethod method = methods[i];
-
-            DocletTag tag = method.getTagByName(DOC_JSP_ATTRIBUTE);
-            if (tag != null)
-            {
-                Map props = tag.getNamedParameterMap();
-                processTagAttribute(props, (AbstractJavaEntity)tag.getContext(), clazz,
-                        method, ctag);
-            }
-
-            Annotation anno = getAnnotation(method, DOC_JSP_ATTRIBUTE);
-            if (anno != null)
-            {
-                Map props = anno.getNamedParameterMap();
-                processTagAttribute(props, (AbstractJavaEntity)anno.getContext(), clazz,
-                        method, ctag);
-            }
-        }
-        
-        DocletTag[] jspProperties = clazz.getTagsByName(DOC_JSP_ATTRIBUTE);
-        for (int i = 0; i < jspProperties.length; ++i)
-        {
-            //We have here only doclets, because this part is only for
-            //solve problems with binding property on 1.1
-            DocletTag tag = jspProperties[i];
-            
-            Map props = tag.getNamedParameterMap();
-            processTagAttribute(props, (AbstractJavaEntity)tag.getContext(), clazz,
-                    ctag);
-            
-        }                
-    }
-    
-    private void processTagAttribute(Map props, AbstractJavaEntity ctx,
-            JavaClass clazz, JavaMethod method, TagMeta tag)
-    {
-        Boolean required = getBoolean(clazz, "required", props, null);
-        Boolean rtexprvalue = getBoolean(clazz, "rtexprvalue", props, null);
-
-        String longDescription = ctx.getComment();
-        String descDflt = getFirstSentence(longDescription);
-        if ((descDflt == null) || (descDflt.length() < 2))
-        {
-            descDflt = "no description";
-        }
-        String shortDescription = getString(clazz, "desc", props, descDflt);
-                
-        Type returnType = null;
-        
-        if (method.getName().startsWith("set"))
-        {
-            returnType = method.getParameters()[0].getType();
-        }
-        else
-        {
-            returnType = method.getReturns();
-        }
-
-        String fullyQualifiedReturnType = returnType.getJavaClass().getFullyQualifiedName();
-        
-        fullyQualifiedReturnType = getFullyQualifiedClassName(clazz,fullyQualifiedReturnType);
-        
-        if (returnType.isArray() && (fullyQualifiedReturnType.indexOf('[') == -1))
-        {
-            for (int i = 0; i < returnType.getDimensions();i++)
-            {
-                fullyQualifiedReturnType = fullyQualifiedReturnType + "[]";
-            }
-        }
-                
-        String className = getString(clazz,"className",props, fullyQualifiedReturnType);
-        String deferredValueType = getString(clazz, "deferredValueType", props, null);
-        String deferredMethodSignature = getString(clazz, "deferredMethodSignature", props, null);
-        Boolean exclude = getBoolean(clazz, "exclude", props, null);
-        
-        AttributeMeta a = new AttributeMeta();
-        a.setName(methodToPropName(method.getName()));
-        a.setClassName(className);
-        a.setRequired(required);
-        a.setRtexprvalue(rtexprvalue);
-        a.setDescription(shortDescription);
-        a.setLongDescription(longDescription);
-        a.setDeferredValueType(deferredValueType);
-        a.setDeferredMethodSignature(deferredMethodSignature);
-        a.setExclude(exclude);
-        
-        tag.addAttribute(a);
-    }
-    
-    private void processTagAttribute(Map props, AbstractJavaEntity ctx,
-            JavaClass clazz, TagMeta tag)
-    {
-        Boolean required = getBoolean(clazz, "required", props, null);
-        Boolean rtexprvalue = getBoolean(clazz, "rtexprvalue", props, null);
-
-        String longDescription = getString(clazz, "longDescription", props, null);
-        String descDflt = longDescription;
-        if ((descDflt == null) || (descDflt.length() < 2))
-        {
-            descDflt = "no description";
-        }
-        String shortDescription = getString(clazz, "desc", props, descDflt);
-                
-        String name = getString(clazz, "name", props, descDflt);
-        String className = getString(clazz, "className", props, descDflt);
-        String deferredValueType = getString(clazz, "deferredValueType", props, null);
-        String deferredMethodSignature = getString(clazz, "deferredMethodSignature", props, null);
-        Boolean exclude = getBoolean(clazz, "exclude", props, null);
-                
-        AttributeMeta a = new AttributeMeta();
-        a.setName(name);
-        a.setClassName(className);
-        a.setRequired(required);
-        a.setRtexprvalue(rtexprvalue);
-        a.setDescription(shortDescription);
-        a.setLongDescription(longDescription);
-        a.setDeferredValueType(deferredValueType);
-        a.setDeferredMethodSignature(deferredMethodSignature);
-        a.setExclude(exclude);
-        
-        tag.addAttribute(a);
-    }
-    
-
-    
-    /**
-     * Look for any methods on the specified class that are annotated as being
-     * component properties, and add metadata about them to the model.
-     */
-    private void processComponentProperties(JavaClass clazz,
-            PropertyHolder component)
-    {
-        JavaMethod[] methods = clazz.getMethods();
-        for (int i = 0; i < methods.length; ++i)
-        {
-            JavaMethod method = methods[i];
-
-            DocletTag tag = method.getTagByName(DOC_PROPERTY);
-            if (tag != null)
-            {
-                Map props = tag.getNamedParameterMap();
-                processComponentProperty(props, (AbstractJavaEntity)tag.getContext(), clazz,
-                        method, component);
-            }
-
-            Annotation anno = getAnnotation(method, DOC_PROPERTY);
-            if (anno != null)
-            {
-                Map props = anno.getNamedParameterMap();
-                processComponentProperty(props, (AbstractJavaEntity)anno.getContext(), clazz,
-                        method, component);
-            }
-        }
-        
-        Type [] interfaces = clazz.getImplements();
-        
-        //Scan interfaces for properties to be added to this component
-        //This feature allow us to have groups of functions.
-        for (int i = 0; i < interfaces.length;++i)
-        {
-            JavaClass intf = interfaces[i].getJavaClass();
-
-            //If the interfaces has a JSFComponent Doclet,
-            //this is managed in other way
-            if (intf.getTagByName(DOC_COMPONENT, false) == null)
-            {
-                JavaMethod[] intfmethods = intf.getMethods();
-                for (int j = 0; j < intfmethods.length; ++j)
-                {
-                    JavaMethod intfmethod = intfmethods[j];
-
-                    DocletTag tag = intfmethod.getTagByName(DOC_PROPERTY);
-                    if (tag != null)
-                    {
-                        Map props = tag.getNamedParameterMap();
-                        processInterfaceComponentProperty(props, (AbstractJavaEntity)tag.getContext(), 
-                                clazz, intfmethod, component);
-                    }
-
-                    Annotation anno = getAnnotation(intfmethod, DOC_PROPERTY);
-                    if (anno != null)
-                    {
-                        Map props = anno.getNamedParameterMap();
-                        processInterfaceComponentProperty(props, (AbstractJavaEntity)anno.getContext(),
-                                clazz, intfmethod, component);
-                    }
-                }
-            }
-        }
-
-        //Scan for properties defined only on jsp (special case on myfaces 1.1,
-        //this feature should not be used on typical situations)
-        DocletTag[] jspProperties = clazz.getTagsByName(DOC_JSP_PROPERTY);
-        for (int i = 0; i < jspProperties.length; ++i)
-        {
-            //We have here only doclets, because this part is only for
-            //solve problems with binding property on 1.1
-            DocletTag tag = jspProperties[i];
-            
-            Map props = tag.getNamedParameterMap();
-            processComponentJspProperty(props, (AbstractJavaEntity)tag.getContext(), clazz,
-                    component);
-        }
-        
-        Annotation jspPropertyAnno = getAnnotation(clazz, DOC_JSP_PROPERTY);
-        if (jspPropertyAnno != null)
-        {
-            Map props = jspPropertyAnno.getNamedParameterMap();
-            processComponentJspProperty(props, (AbstractJavaEntity)jspPropertyAnno.getContext(),
-                    clazz, component);
-        }
-        
-        
-        Annotation jspAnno = getAnnotation(clazz, DOC_JSP_PROPERTIES);        
-        if (jspAnno != null)
-        {
-            Object jspProps = jspAnno.getNamedParameter("properties");
-            
-            if (jspProps instanceof Annotation)
-            {
-                Annotation jspPropertiesAnno = (Annotation) jspProps;
-                Map props = jspPropertiesAnno.getNamedParameterMap();
-                processComponentJspProperty(props, (AbstractJavaEntity)jspAnno.getContext(), clazz,
-                        component);               
-            }
-            else
-            {
-                List jspPropsList = (List) jspProps;
-                for (int i = 0; i < jspPropsList.size();i++)
-                {
-                    Annotation anno = (Annotation) jspPropsList.get(i);
-
-                    Map props = anno.getNamedParameterMap();
-                    processComponentJspProperty(props, (AbstractJavaEntity)jspAnno.getContext(), clazz,
-                            component);                    
-                }
-            }
-            
-        }
-    }
-        
-    private void processComponentFacets(JavaClass clazz,
-            FacetHolder component)
-    {
-        JavaMethod[] methods = clazz.getMethods();
-        for (int i = 0; i < methods.length; ++i)
-        {
-            JavaMethod method = methods[i];
-
-            DocletTag tag = method.getTagByName(DOC_FACET);
-            if (tag != null)
-            {
-                Map props = tag.getNamedParameterMap();
-                processComponentFacet(props, (AbstractJavaEntity)tag.getContext(), clazz,
-                        method, component);
-            }
-
-            Annotation anno = getAnnotation(method, DOC_FACET);
-            if (anno != null)
-            {
-                Map props = anno.getNamedParameterMap();
-                processComponentFacet(props, (AbstractJavaEntity)anno.getContext(), clazz,
-                        method, component);
-            }
-        }
-        
-        Type [] interfaces = clazz.getImplements();
-        
-        //Scan interfaces for properties to be added to this component
-        //This feature allow us to have groups of functions.
-        for (int i = 0; i < interfaces.length;++i)
-        {
-            JavaClass intf = interfaces[i].getJavaClass();
-
-            //If the interfaces has a JSFComponent Doclet,
-            //this is managed in other way
-            if (intf.getTagByName(DOC_COMPONENT, false) == null)
-            {
-                JavaMethod[] intfmethods = intf.getMethods();
-                for (int j = 0; j < intfmethods.length; ++j)
-                {
-                    JavaMethod intfmethod = intfmethods[j];
-
-                    DocletTag tag = intfmethod.getTagByName(DOC_FACET);
-                    if (tag != null)
-                    {
-                        Map props = tag.getNamedParameterMap();
-                        processInterfaceComponentFacet(props, (AbstractJavaEntity)tag.getContext(), 
-                                clazz, intfmethod, component);
-                    }
-
-                    Annotation anno = getAnnotation(intfmethod, DOC_FACET);
-                    if (anno != null)
-                    {
-                        Map props = anno.getNamedParameterMap();
-                        processInterfaceComponentFacet(props, (AbstractJavaEntity)anno.getContext(),
-                                clazz, intfmethod, component);
-                    }
-                }
-            }
-        }
-    }
-        
-    private void processInterfaceComponentProperty(Map props, AbstractJavaEntity ctx,
-    JavaClass clazz, JavaMethod method, PropertyHolder component)
-    {
-        this.processComponentProperty(props, ctx, clazz, method, component);
-        
-        PropertyMeta property = component.getProperty(methodToPropName(method.getName()));
-        
-        //Try to get the method from the component clazz to see if this
-        //has an implementation
-        JavaMethod clazzMethod = clazz.getMethodBySignature(method.getName(), null , false);
-        
-        if (clazzMethod == null)
-        {
-            //The method should be generated!
-            property.setGenerated(Boolean.TRUE);
-        }            
-    }
-
-    private void processInterfaceComponentFacet(Map props, AbstractJavaEntity ctx,
-            JavaClass clazz, JavaMethod method, FacetHolder component)
-    {
-        this.processComponentFacet(props, ctx, clazz, method, component);
-                
-        FacetMeta facet = component.getFacet(methodToPropName(method.getName()));
-                
-        //Try to get the method from the component clazz to see if this
-        //has an implementation
-        JavaMethod clazzMethod = clazz.getMethodBySignature(method.getName(), null , false);
-                
-        if (clazzMethod == null)
-        {
-            //The method should be generated!
-            facet.setGenerated(Boolean.TRUE);
-        }            
-    }
-    
-    private void processComponentProperty(Map props, AbstractJavaEntity ctx,
-            JavaClass clazz, JavaMethod method, PropertyHolder component)
-    {
-        Boolean required = getBoolean(clazz, "required", props, null);
-        Boolean transientProp = getBoolean(clazz, "transient", props, null);
-        transientProp = getBoolean(clazz, "istransient", props, transientProp);
-        Boolean stateHolder = getBoolean(clazz, "stateHolder", props, null);
-        Boolean literalOnly = getBoolean(clazz, "literalOnly", props, null);
-        Boolean tagExcluded = getBoolean(clazz, "tagExcluded", props, null);
-        Boolean localMethod = getBoolean(clazz, "localMethod",props,null);
-        Boolean setMethod = getBoolean(clazz, "setMethod",props,null);
-        String localMethodScope = getString(clazz, "localMethodScope",props,null);
-        String setMethodScope = getString(clazz, "setMethodScope",props,null);
-        Boolean inheritedTag = getBoolean(clazz, "inheritedTag",props,null);
-
-        String longDescription = ctx.getComment();
-        String descDflt = getFirstSentence(longDescription);
-        if ((descDflt == null) || (descDflt.length() < 2))
-        {
-            descDflt = "no description";
-        }
-        String shortDescription = getString(clazz, "desc", props, descDflt);
-        String returnSignature = getString(clazz, "returnSignature", props, null);
-        String methodSignature = getString(clazz, "methodSignature", props, null);
-        String defaultValue = getString(clazz,"defaultValue",props,null);
-        String jspName = getString(clazz,"jspName",props,null);
-        Boolean rtexprvalue = getBoolean(clazz, "rtexprvalue",props,null);
-        String clientEvent = getString(clazz, "clientEvent",props,null);
-        String deferredValueType = getString(clazz, "deferredValueType", props, null);
-
-        Type returnType = null;
-        
-        if (method.getName().startsWith("set"))
-        {
-            returnType = method.getParameters()[0].getType();
-        }
-        else
-        {
-            returnType = method.getReturns();
-        }
-        
-        String fullyQualifiedReturnType = returnType.getJavaClass().getFullyQualifiedName();
-        
-        fullyQualifiedReturnType = getFullyQualifiedClassName(clazz, fullyQualifiedReturnType);
-        
-        if (returnType.isArray() && (fullyQualifiedReturnType.indexOf('[') == -1))
-        {
-            for (int i = 0; i < returnType.getDimensions();i++)
-            {
-                fullyQualifiedReturnType = fullyQualifiedReturnType + "[]";
-            }
-        }
-        
-        PropertyMeta p = new PropertyMeta();
-        p.setName(methodToPropName(method.getName()));
-        p.setClassName(fullyQualifiedReturnType);
-        p.setRequired(required);
-        p.setTransient(transientProp);
-        p.setStateHolder(stateHolder);
-        p.setLiteralOnly(literalOnly);
-        p.setTagExcluded(tagExcluded);
-        p.setDescription(shortDescription);
-        p.setLongDescription(longDescription);
-        p.setDefaultValue(defaultValue);
-        p.setLocalMethod(localMethod);
-        p.setLocalMethodScope(localMethodScope);
-        p.setSetMethod(setMethod);
-        p.setSetMethodScope(setMethodScope);
-        p.setJspName(jspName);
-        p.setRtexprvalue(rtexprvalue);
-        p.setDeferredValueType(deferredValueType);
-        p.setClientEvent(clientEvent);
-        p.setInheritedTag(inheritedTag);
-        
-        if (returnSignature != null)
-        {
-            MethodSignatureMeta signature = new MethodSignatureMeta();
-            signature.setReturnType(returnSignature);
-            
-            if (methodSignature != null)
-            {
-                String[] params = StringUtils.split(methodSignature,',');
-                
-                if (params != null)
-                {
-                    for (int i = 0; i < params.length; i++)
-                    {
-                        signature.addParameterType(params[i].trim());
-                    }
-                }
-            }
-            p.setMethodBindingSignature(signature);
-        }
-        
-        //If the method is abstract this should be generated
-        if (method.isAbstract())
-        {
-            p.setGenerated(Boolean.TRUE);
-        }
-
-        component.addProperty(p);
-    }
-    
-    private void processComponentFacet(Map props, AbstractJavaEntity ctx,
-            JavaClass clazz, JavaMethod method, FacetHolder component)
-    {
-        Boolean required = getBoolean(clazz, "required", props, null);
-
-        String longDescription = ctx.getComment();
-        String descDflt = getFirstSentence(longDescription);
-        if ((descDflt == null) || (descDflt.length() < 2))
-        {
-            descDflt = "no description";
-        }
-        String shortDescription = getString(clazz, "desc", props, descDflt);
-        
-        FacetMeta p = new FacetMeta();
-        p.setName(methodToPropName(method.getName()));
-        p.setRequired(required);
-        p.setDescription(shortDescription);
-        p.setLongDescription(longDescription);
-        
-        //If the method is abstract this should be generated
-        if (method.isAbstract())
-        {
-            p.setGenerated(Boolean.TRUE);
-        }
-
-        component.addFacet(p);
-    }
-    
-    
-    private void processComponentJspProperty(Map props, AbstractJavaEntity ctx,
-            JavaClass clazz, PropertyHolder component)
-    {
-        Boolean required = getBoolean(clazz, "required", props, null);
-        Boolean transientProp = getBoolean(clazz, "transient", props, null);
-        Boolean stateHolder = getBoolean(clazz, "stateHolder", props, null);
-        Boolean literalOnly = getBoolean(clazz, "literalOnly", props, null);
-        Boolean tagExcluded = getBoolean(clazz, "tagExcluded", props, null);
-        Boolean inheritedTag = getBoolean(clazz, "inheritedTag", props, null);
-
-        String longDescription = getString(clazz, "longDesc", props, null);
-        
-        String descDflt = longDescription;
-        if ((descDflt == null) || (descDflt.length() < 2))
-        {
-            descDflt = "no description";
-        }
-        String shortDescription = getString(clazz, "desc", props, descDflt);
-        String returnType = getString(clazz, "returnType", props, null);
-        String name = getString(clazz, "name", props, null);
-        
-        PropertyMeta p = new PropertyMeta();
-        p.setName(name);
-        p.setClassName(returnType);
-        p.setRequired(required);
-        p.setTransient(transientProp);
-        p.setStateHolder(stateHolder);
-        p.setLiteralOnly(literalOnly);
-        p.setTagExcluded(tagExcluded);
-        p.setInheritedTag(inheritedTag);
-        p.setDescription(shortDescription);
-        p.setLongDescription(longDescription);
-        
-        p.setGenerated(Boolean.FALSE);
-
-        component.addProperty(p);
-    }
-    
-
-    /**
-     * Convert a method name to a property name.
-     */
-    static String methodToPropName(String methodName)
-    {
-        StringBuffer name = new StringBuffer();
-        if (methodName.startsWith("get") || methodName.startsWith("set"))
-        {
-            name.append(methodName.substring(3));
-        }
-        else if (methodName.startsWith("is"))
-        {
-            name.append(methodName.substring(2));
-        }
-        else
-        {
-            throw new IllegalArgumentException("Invalid annotated method name "
-                    + methodName);
-        }
-
-        // Handle following styles of property name
-        // getfooBar --> fooBar
-        // getFooBar --> fooBar
-        // getURL --> url
-        // getURLLocation --> urlLocation
-        for (int i = 0; i < name.length(); ++i)
-        {
-            char c = name.charAt(i);
-            if (Character.isUpperCase(c))
-            {
-                name.setCharAt(i, Character.toLowerCase(c));
-            }
-            else
-            {
-                if (i > 1)
-                {
-                    // reset the previous char to uppercase
-                    c = name.charAt(i - 1);
-                    name.setCharAt(i - 1, Character.toUpperCase(c));
-                }
-                break;
-            }
-        }
-        return name.toString();
-    }
-
-    /**
-     * Given the full javadoc for a component, extract just the "first
-     * sentence".
-     * <p>
-     * Initially, just find the first dot, and strip out any linefeeds. Later,
-     * try to handle "e.g." and similar (see javadoc algorithm for sentence
-     * detection).
-     */
-    private String getFirstSentence(String doc)
-    {
-        if (doc == null)
-        {
-            return null;
-        }
-
-        int index = doc.indexOf('.');
-        if (index == -1)
-        {
-            return doc;
-        }
-        // abc.
-        return doc.substring(0, index);
-    }
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/unpack/AbstractDependencyMojo.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/unpack/AbstractDependencyMojo.java
deleted file mode 100644
index e22f640..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/unpack/AbstractDependencyMojo.java
+++ /dev/null
@@ -1,416 +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.
- */
-
-package org.apache.myfaces.buildtools.maven2.plugin.builder.unpack;
-
-import java.io.File;
-import java.lang.reflect.Field;
-import java.util.List;
-
-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
-import org.apache.maven.artifact.resolver.ArtifactCollector;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.dependency.utils.DependencySilentLog;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.project.MavenProject;
-import org.codehaus.plexus.archiver.ArchiverException;
-import org.codehaus.plexus.archiver.UnArchiver;
-import org.codehaus.plexus.archiver.manager.ArchiverManager;
-import org.codehaus.plexus.archiver.manager.NoSuchArchiverException;
-import org.codehaus.plexus.components.io.fileselectors.IncludeExcludeFileSelector;
-import org.codehaus.plexus.util.FileUtils;
-import org.codehaus.plexus.util.ReflectionUtils;
-import org.codehaus.plexus.util.StringUtils;
-
-/**
- * @author <a href="mailto:brianf@apache.org">Brian Fox</a>
- * @version $Id: AbstractDependencyMojo.java 552528
- *          2007-07-02 16:12:47Z markh $
- */
-public abstract class AbstractDependencyMojo
-    extends AbstractMojo
-{
-    /**
-     * Used to look up Artifacts in the remote repository.
-     * 
-     * @parameter expression="${component.org.apache.maven.artifact.factory.ArtifactFactory}"
-     * @required
-     * @readonly
-     */
-    protected org.apache.maven.artifact.factory.ArtifactFactory factory;
-
-    /**
-     * Used to look up Artifacts in the remote repository.
-     * 
-     * @parameter expression="${component.org.apache.maven.artifact.resolver.ArtifactResolver}"
-     * @required
-     * @readonly
-     */
-    protected org.apache.maven.artifact.resolver.ArtifactResolver resolver;
-
-    /**
-     * Artifact collector, needed to resolve dependencies.
-     * 
-     * @component role="org.apache.maven.artifact.resolver.ArtifactCollector"
-     * @required
-     * @readonly
-     */
-    protected ArtifactCollector artifactCollector;
-
-    /**
-     * @component role="org.apache.maven.artifact.metadata.ArtifactMetadataSource"
-     *            hint="maven"
-     * @required
-     * @readonly
-     */
-    protected ArtifactMetadataSource artifactMetadataSource;
-
-    /**
-     * Location of the local repository.
-     * 
-     * @parameter expression="${localRepository}"
-     * @readonly
-     * @required
-     */
-    protected org.apache.maven.artifact.repository.ArtifactRepository local;
-
-    /**
-     * List of Remote Repositories used by the resolver
-     * 
-     * @parameter expression="${project.remoteArtifactRepositories}"
-     * @readonly
-     * @required
-     */
-    protected java.util.List remoteRepos;
-
-    /**
-     * To look up Archiver/UnArchiver implementations
-     * 
-     * @parameter expression="${component.org.codehaus.plexus.archiver.manager.ArchiverManager}"
-     * @required
-     * @readonly
-     */
-    protected ArchiverManager archiverManager;
-
-    /**
-     * POM
-     * 
-     * @parameter expression="${project}"
-     * @readonly
-     * @required
-     */
-    protected MavenProject project;
-
-    /**
-     * Contains the full list of projects in the reactor.
-     * 
-     * @parameter expression="${reactorProjects}"
-     * @required
-     * @readonly
-     */
-    protected List reactorProjects;
-
-    /**
-     * If the plugin should be silent.
-     * 
-     * @optional
-     * @since 2.0
-     * @parameter expression="${silent}"
-     *            default-value="false"
-     */
-    public boolean silent;
-
-    /**
-     * Output absolute filename for resolved artifacts
-     * 
-     * @optional
-     * @since 2.0
-     * @parameter expression="${outputAbsoluteArtifactFilename}"
-     *            default-value="false"
-     */
-    protected boolean outputAbsoluteArtifactFilename;
-
-    private Log log;
-
-    /**
-     * @return Returns the log.
-     */
-    public Log getLog ()
-    {
-        if ( silent )
-        {
-            log = new DependencySilentLog();
-        }
-        else
-        {
-            log = super.getLog();
-        }
-
-        return this.log;
-    }
-
-    /**
-     * @return Returns the archiverManager.
-     */
-    public ArchiverManager getArchiverManager ()
-    {
-        return this.archiverManager;
-    }
-
-    /**
-     * Does the actual copy of the file and logging.
-     * 
-     * @param artifact represents the file to copy.
-     * @param destFile file name of destination file.
-     * 
-     * @throws MojoExecutionException with a message if an
-     *             error occurs.
-     */
-    protected void copyFile ( File artifact, File destFile )
-        throws MojoExecutionException
-    {
-        Log theLog = this.getLog();
-        try
-        {
-            theLog.info( "Copying "
-                + ( this.outputAbsoluteArtifactFilename ? artifact.getAbsolutePath() : artifact.getName() ) + " to "
-                + destFile );
-            FileUtils.copyFile( artifact, destFile );
-
-        }
-        catch ( Exception e )
-        {
-            throw new MojoExecutionException( "Error copying artifact from " + artifact + " to " + destFile, e );
-        }
-    }
-
-    protected void unpack ( File file, File location )
-        throws MojoExecutionException
-    {
-        unpack( file, location, null, null );
-    }
-
-    /**
-     * Unpacks the archive file.
-     * 
-     * @param file File to be unpacked.
-     * @param location Location where to put the unpacked
-     *            files.
-     * @param includes Comma separated list of file patterns
-     *            to include i.e. **\/*.xml,
-     *            **\/*.properties
-     * @param excludes Comma separated list of file patterns
-     *            to exclude i.e. **\/*.xml,
-     *            **\/*.properties
-     */
-    protected void unpack ( File file, File location, String includes, String excludes )
-        throws MojoExecutionException
-    {
-        try
-        {
-            getLog().info(
-                            "Unpacking " + file.getPath() + "to\n " + location.getPath()
-                                + "\nwith Includes " + includes + " and excludes:" + excludes );
-
-            location.mkdirs();
-
-            UnArchiver unArchiver;
-
-            unArchiver = archiverManager.getUnArchiver( file );
-
-            unArchiver.setSourceFile( file );
-
-            unArchiver.setDestDirectory( location );
-
-            if ( StringUtils.isNotEmpty( excludes ) || StringUtils.isNotEmpty( includes ) )
-            {
-                // Create the selectors that will filter
-                // based on include/exclude parameters
-                // MDEP-47
-                IncludeExcludeFileSelector[] selectors = new IncludeExcludeFileSelector[]
-                    {
-                        new IncludeExcludeFileSelector() 
-                    };
-
-                if ( StringUtils.isNotEmpty( excludes ) )
-                {
-                    selectors[0].setExcludes( excludes.split( "," ) );
-                }
-
-                if ( StringUtils.isNotEmpty( includes ) )
-                {
-                    selectors[0].setIncludes( includes.split( "," ) );
-                }
-
-                unArchiver.setFileSelectors( selectors );
-            }
-            if ( this.silent )
-            {
-                silenceUnarchiver( unArchiver );
-            }
-
-            unArchiver.extract();
-        }
-        catch ( NoSuchArchiverException e )
-        {
-            throw new MojoExecutionException( "Unknown archiver type", e );
-        }
-        catch ( ArchiverException e )
-        {
-            e.printStackTrace();
-            throw new MojoExecutionException( "Error unpacking file: " + file + " to: " + location + "\r\n"
-                + e.toString(), e );
-        }
-    }
-
-    private void silenceUnarchiver ( UnArchiver unArchiver )
-    {
-        // dangerous but handle any errors. It's the only
-        // way to silence the
-        // unArchiver.
-        try
-        {
-            Field field = ReflectionUtils.getFieldByNameIncludingSuperclasses( "logger", unArchiver.getClass() );
-
-            field.setAccessible( true );
-
-            field.set( unArchiver, this.getLog() );
-        }
-        catch ( Exception e )
-        {
-            // was a nice try. Don't bother logging because
-            // the log is silent.
-        }
-    }
-
-    /**
-     * @return Returns the factory.
-     */
-    public org.apache.maven.artifact.factory.ArtifactFactory getFactory ()
-    {
-        return this.factory;
-    }
-
-    /**
-     * @param factory The factory to set.
-     */
-    public void setFactory ( org.apache.maven.artifact.factory.ArtifactFactory factory )
-    {
-        this.factory = factory;
-    }
-
-    /**
-     * @return Returns the project.
-     */
-    public MavenProject getProject ()
-    {
-        return this.project;
-    }
-
-    /**
-     * @return Returns the local.
-     */
-    public org.apache.maven.artifact.repository.ArtifactRepository getLocal ()
-    {
-        return this.local;
-    }
-
-    /**
-     * @param local The local to set.
-     */
-    public void setLocal ( org.apache.maven.artifact.repository.ArtifactRepository local )
-    {
-        this.local = local;
-    }
-
-    /**
-     * @return Returns the remoteRepos.
-     */
-    public java.util.List getRemoteRepos ()
-    {
-        return this.remoteRepos;
-    }
-
-    /**
-     * @param remoteRepos The remoteRepos to set.
-     */
-    public void setRemoteRepos ( java.util.List remoteRepos )
-    {
-        this.remoteRepos = remoteRepos;
-    }
-
-    /**
-     * @return Returns the resolver.
-     */
-    public org.apache.maven.artifact.resolver.ArtifactResolver getResolver ()
-    {
-        return this.resolver;
-    }
-
-    /**
-     * @param resolver The resolver to set.
-     */
-    public void setResolver ( org.apache.maven.artifact.resolver.ArtifactResolver resolver )
-    {
-        this.resolver = resolver;
-    }
-
-    /**
-     * @param archiverManager The archiverManager to set.
-     */
-    public void setArchiverManager ( ArchiverManager archiverManager )
-    {
-        this.archiverManager = archiverManager;
-    }
-
-    /**
-     * @return Returns the artifactCollector.
-     */
-    public ArtifactCollector getArtifactCollector ()
-    {
-        return this.artifactCollector;
-    }
-
-    /**
-     * @param theArtifactCollector The artifactCollector to
-     *            set.
-     */
-    public void setArtifactCollector ( ArtifactCollector theArtifactCollector )
-    {
-        this.artifactCollector = theArtifactCollector;
-    }
-
-    /**
-     * @return Returns the artifactMetadataSource.
-     */
-    public ArtifactMetadataSource getArtifactMetadataSource ()
-    {
-        return this.artifactMetadataSource;
-    }
-
-    /**
-     * @param theArtifactMetadataSource The
-     *            artifactMetadataSource to set.
-     */
-    public void setArtifactMetadataSource ( ArtifactMetadataSource theArtifactMetadataSource )
-    {
-        this.artifactMetadataSource = theArtifactMetadataSource;
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/unpack/AbstractFromConfigurationMojo.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/unpack/AbstractFromConfigurationMojo.java
deleted file mode 100644
index 58c89cc..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/unpack/AbstractFromConfigurationMojo.java
+++ /dev/null
@@ -1,434 +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.
- */
-
-package org.apache.myfaces.buildtools.maven2.plugin.builder.unpack;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
-import org.apache.maven.artifact.versioning.VersionRange;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.plugin.MojoExecutionException;
-//import org.apache.maven.plugin.dependency.fromConfiguration.ArtifactItem;
-import org.apache.maven.plugin.dependency.utils.DependencyUtil;
-import org.apache.maven.plugin.dependency.utils.filters.ArtifactItemFilter;
-import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException;
-import org.codehaus.plexus.util.StringUtils;
-
-/**
- * Abstract Parent class used by mojos that get Artifact information from the
- * plugin configuration as an ArrayList of ArtifactItems
- * 
- * @see ArtifactItem
- * @author <a href="mailto:brianf@apache.org">Brian Fox</a>
- * @version $Id$
- * 
- */
-public abstract class AbstractFromConfigurationMojo
-    extends AbstractDependencyMojo
-{
-
-    /**
-     * Default location used for mojo unless overridden in ArtifactItem
-     * 
-     * @parameter expression="${outputDirectory}"
-     *            default-value="${project.build.directory}/dependency"
-     * @optional
-     * @since 1.0
-     */
-    private File outputDirectory;
-
-    /**
-     * Overwrite release artifacts
-     * 
-     * @optional
-     * @since 1.0
-     * @parameter expression="${mdep.overWriteReleases}" default-value="false"
-     */
-    private boolean overWriteReleases;
-
-    /**
-     * Overwrite snapshot artifacts
-     * 
-     * @optional
-     * @since 1.0
-     * @parameter expression="${mdep.overWriteSnapshots}" default-value="false"
-     */
-    private boolean overWriteSnapshots;
-
-    /**
-     * Overwrite if newer
-     * 
-     * @optional
-     * @since 2.0
-     * @parameter expression="${mdep.overIfNewer}" default-value="true"
-     */
-    private boolean overWriteIfNewer;
-
-    /**
-     * Collection of ArtifactItems to work on. (ArtifactItem contains groupId,
-     * artifactId, version, type, classifier, location, destFile, markerFile and overwrite.)
-     * See "Usage" and "Javadoc" for details.
-     * 
-     * @parameter
-     * @required
-     * @since 1.0
-     */
-    private ArrayList artifactItems;
-
-    abstract ArtifactItemFilter getMarkedArtifactFilter( ArtifactItem item );
-
-    /**
-     * Preprocesses the list of ArtifactItems. This method defaults the
-     * outputDirectory if not set and creates the output Directory if it doesn't
-     * exist.
-     * 
-     * @param removeVersion
-     *            remove the version from the filename.
-     * @return An ArrayList of preprocessed ArtifactItems
-     * 
-     * @throws MojoExecutionException
-     *             with a message if an error occurs.
-     * 
-     * @see ArtifactItem
-     */
-    protected ArrayList getProcessedArtifactItems( boolean removeVersion )
-        throws MojoExecutionException
-    {
-        if ( artifactItems == null || artifactItems.size() < 1 )
-        {
-            throw new MojoExecutionException( "There are no artifactItems configured." );
-        }
-
-        Iterator iter = artifactItems.iterator();
-        while ( iter.hasNext() )
-        {
-            ArtifactItem artifactItem = (ArtifactItem) iter.next();
-            this.getLog().info( "Configured Artifact: " + artifactItem.toString() );
-
-            if ( artifactItem.getOutputDirectory() == null )
-            {
-                artifactItem.setOutputDirectory( this.outputDirectory );
-            }
-            artifactItem.getOutputDirectory().mkdirs();
-
-            // make sure we have a version.
-            if ( StringUtils.isEmpty( artifactItem.getVersion() ) )
-            {
-                fillMissingArtifactVersion( artifactItem );
-            }
-
-            artifactItem.setArtifact( this.getArtifact( artifactItem ) );
-
-            if ( StringUtils.isEmpty( artifactItem.getDestFileName() ) )
-            {
-                artifactItem.setDestFileName( DependencyUtil.getFormattedFileName( artifactItem.getArtifact(),
-                                                                                   removeVersion ) );
-            }
-
-            try
-            {
-                artifactItem.setNeedsProcessing( checkIfProcessingNeeded( artifactItem ) );
-            }
-            catch ( ArtifactFilterException e )
-            {
-                throw new MojoExecutionException (e.getMessage(),e);
-            }
-        }
-        return artifactItems;
-    }
-
-    private boolean checkIfProcessingNeeded( ArtifactItem item )
-        throws MojoExecutionException, ArtifactFilterException
-    {
-        boolean result = false;
-        if ( StringUtils.equalsIgnoreCase( item.getOverWrite(), "true" ) )
-        {
-            result = true;
-        }
-        else
-        {
-            ArtifactItemFilter filter = getMarkedArtifactFilter( item );
-            result = filter.isArtifactIncluded( item );
-        }
-        return result;
-    }
-
-    /**
-     * Resolves the Artifact from the remote repository if nessessary. If no
-     * version is specified, it will be retrieved from the dependency list or
-     * from the DependencyManagement section of the pom.
-     * 
-     * @param artifactItem
-     *            containing information about artifact from plugin
-     *            configuration.
-     * @return Artifact object representing the specified file.
-     * 
-     * @throws MojoExecutionException
-     *             with a message if the version can't be found in
-     *             DependencyManagement.
-     */
-    protected Artifact getArtifact( ArtifactItem artifactItem )
-        throws MojoExecutionException
-    {
-        Artifact artifact;
-
-        // Map managedVersions = createManagedVersionMap( factory,
-        // project.getId(), project.getDependencyManagement() );
-        VersionRange vr;
-        try
-        {
-            vr = VersionRange.createFromVersionSpec( artifactItem.getVersion() );
-        }
-        catch ( InvalidVersionSpecificationException e1 )
-        {
-            // TODO Auto-generated catch block
-            e1.printStackTrace();
-            vr = VersionRange.createFromVersion( artifactItem.getVersion() );
-        }
-
-        if ( StringUtils.isEmpty( artifactItem.getClassifier() ) )
-        {
-            artifact = factory.createDependencyArtifact( artifactItem.getGroupId(), artifactItem.getArtifactId(), vr,
-                                                         artifactItem.getType(), null, Artifact.SCOPE_COMPILE );
-        }
-        else
-        {
-            artifact = factory.createDependencyArtifact( artifactItem.getGroupId(), artifactItem.getArtifactId(), vr,
-                                                         artifactItem.getType(), artifactItem.getClassifier(),
-                                                         Artifact.SCOPE_COMPILE );
-        }
-
-        try
-        {
-            // mdep-50 - rolledback for now because it's breaking some
-            // functionality.
-            /*
-             * List listeners = new ArrayList();
-             * 
-             * Set theSet = new HashSet(); theSet.add( artifact );
-             * ArtifactResolutionResult artifactResolutionResult =
-             * artifactCollector.collect( theSet, project .getArtifact(),
-             * managedVersions, this.local,
-             * project.getRemoteArtifactRepositories(), artifactMetadataSource,
-             * null, listeners ); Iterator iter =
-             * artifactResolutionResult.getArtifactResolutionNodes().iterator();
-             * while ( iter.hasNext() ) { ResolutionNode node = (ResolutionNode)
-             * iter.next(); artifact = node.getArtifact(); }
-             */
-
-            resolver.resolve( artifact, remoteRepos, local );
-        }
-        catch ( ArtifactResolutionException e )
-        {
-            throw new MojoExecutionException( "Unable to resolve artifact.", e );
-        }
-        catch ( ArtifactNotFoundException e )
-        {
-            throw new MojoExecutionException( "Unable to find artifact.", e );
-        }
-
-        return artifact;
-    }
-
-    /**
-     * Tries to find missing version from dependancy list and dependency
-     * management. If found, the artifact is updated with the correct version.
-     * 
-     * It will first look for an exact match on artifactId/groupId/classifier/type and if it doesn't find
-     * a match, it will try again looking for artifactId and groupId only.
-     * @param artifact
-     *            representing configured file.
-     * @throws MojoExecutionException
-     */
-    private void fillMissingArtifactVersion( ArtifactItem artifact )
-        throws MojoExecutionException
-    {
-        if ( !findDependencyVersion( artifact, project.getDependencies(), false )
-            && ( project.getDependencyManagement() == null || !findDependencyVersion( artifact, project
-                .getDependencyManagement().getDependencies(), false ) )
-            && !findDependencyVersion( artifact, project.getDependencies(), true )
-            && ( project.getDependencyManagement() == null || !findDependencyVersion( artifact, project
-                .getDependencyManagement().getDependencies(), true ) ) )
-        {
-            throw new MojoExecutionException( "Unable to find artifact version of " + artifact.getGroupId() + ":"
-                + artifact.getArtifactId() + " in either dependency list or in project's dependency management." );
-        }
-    }
-
-    /**
-     * Tries to find missing version from a list of dependencies. If found, the
-     * artifact is updated with the correct version.
-     * 
-     * @param artifact
-     *            representing configured file.
-     * @param list
-     *            list of dependencies to search.
-     * @param looseMatch
-     *            only look at artifactId and groupId
-     * @return the found dependency
-     */
-    private boolean findDependencyVersion( ArtifactItem artifact, List list, boolean looseMatch )
-    {
-        boolean result = false;
-
-        for ( int i = 0; i < list.size(); i++ )
-        {
-            Dependency dependency = (Dependency) list.get( i );
-            if ( StringUtils.equals( dependency.getArtifactId(), artifact.getArtifactId() )
-                && StringUtils.equals( dependency.getGroupId(), artifact.getGroupId() )
-                && ( looseMatch || StringUtils.equals( dependency.getClassifier(), artifact.getClassifier() ) )
-                && ( looseMatch || StringUtils.equals( dependency.getType(), artifact.getType() ) ) )
-            {
-
-                artifact.setVersion( dependency.getVersion() );
-
-                result = true;
-                break;
-            }
-        }
-
-        return result;
-    }
-
-   /* private Map createManagedVersionMap( ArtifactFactory artifactFactory, String projectId,
-                                         DependencyManagement dependencyManagement )
-        throws MojoExecutionException
-    {
-        Map map;
-        if ( dependencyManagement != null && dependencyManagement.getDependencies() != null )
-        {
-            map = new HashMap();
-            for ( Iterator i = dependencyManagement.getDependencies().iterator(); i.hasNext(); )
-            {
-                Dependency d = (Dependency) i.next();
-
-                try
-                {
-                    VersionRange versionRange = VersionRange.createFromVersionSpec( d.getVersion() );
-                    Artifact artifact = artifactFactory.createDependencyArtifact( d.getGroupId(), d.getArtifactId(),
-                                                                                  versionRange, d.getType(), d
-                                                                                      .getClassifier(), d.getScope(), d
-                                                                                      .isOptional() );
-                    map.put( d.getManagementKey(), artifact );
-                }
-                catch ( InvalidVersionSpecificationException e )
-                {
-                    throw new MojoExecutionException( "Unable to parse version", e );
-                }
-            }
-        }
-        else
-        {
-            map = Collections.EMPTY_MAP;
-        }
-        return map;
-    }*/
-
-    /**
-     * @return Returns the artifactItems.
-     */
-    public ArrayList getArtifactItems()
-    {
-        return this.artifactItems;
-    }
-
-    /**
-     * @param theArtifactItems
-     *            The artifactItems to set.
-     */
-    public void setArtifactItems( ArrayList theArtifactItems )
-    {
-        this.artifactItems = theArtifactItems;
-    }
-
-    /**
-     * @return Returns the outputDirectory.
-     */
-    public File getOutputDirectory()
-    {
-        return this.outputDirectory;
-    }
-
-    /**
-     * @param theOutputDirectory
-     *            The outputDirectory to set.
-     */
-    public void setOutputDirectory( File theOutputDirectory )
-    {
-        this.outputDirectory = theOutputDirectory;
-    }
-
-    /**
-     * @return Returns the overWriteIfNewer.
-     */
-    public boolean isOverWriteIfNewer()
-    {
-        return this.overWriteIfNewer;
-    }
-
-    /**
-     * @param theOverWriteIfNewer
-     *            The overWriteIfNewer to set.
-     */
-    public void setOverWriteIfNewer( boolean theOverWriteIfNewer )
-    {
-        this.overWriteIfNewer = theOverWriteIfNewer;
-    }
-
-    /**
-     * @return Returns the overWriteReleases.
-     */
-    public boolean isOverWriteReleases()
-    {
-        return this.overWriteReleases;
-    }
-
-    /**
-     * @param theOverWriteReleases
-     *            The overWriteReleases to set.
-     */
-    public void setOverWriteReleases( boolean theOverWriteReleases )
-    {
-        this.overWriteReleases = theOverWriteReleases;
-    }
-
-    /**
-     * @return Returns the overWriteSnapshots.
-     */
-    public boolean isOverWriteSnapshots()
-    {
-        return this.overWriteSnapshots;
-    }
-
-    /**
-     * @param theOverWriteSnapshots
-     *            The overWriteSnapshots to set.
-     */
-    public void setOverWriteSnapshots( boolean theOverWriteSnapshots )
-    {
-        this.overWriteSnapshots = theOverWriteSnapshots;
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/unpack/ArtifactItem.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/unpack/ArtifactItem.java
deleted file mode 100644
index 2c1ae24..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/unpack/ArtifactItem.java
+++ /dev/null
@@ -1,361 +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.
- */
-
-package org.apache.myfaces.buildtools.maven2.plugin.builder.unpack;
-
-import java.io.File;
-
-import org.apache.maven.artifact.Artifact;
-import org.codehaus.plexus.util.StringUtils;
-
-/**
- * ArtifactItem represents information specified in the plugin configuration
- * section for each artifact.
- * 
- * @since 1.0
- * @author <a href="mailto:brianf@apache.org">Brian Fox</a>
- * @version $Id$
- */
-public class ArtifactItem extends org.apache.maven.plugin.dependency.fromConfiguration.ArtifactItem
-{
-    /**
-     * Group Id of Artifact
-     * 
-     * @parameter
-     * @required
-     */
-    private String groupId;
-
-    /**
-     * Name of Artifact
-     * 
-     * @parameter
-     * @required
-     */
-    private String artifactId;
-
-    /**
-     * Version of Artifact
-     * 
-     * @parameter
-     */
-    private String version = null;
-
-    /**
-     * Type of Artifact (War,Jar,etc)
-     * 
-     * @parameter
-     * @required
-     */
-    private String type = "jar";
-
-    /**
-     * Classifier for Artifact (tests,sources,etc)
-     * 
-     * @parameter
-     */
-    private String classifier;
-
-    /**
-     * Location to use for this Artifact. Overrides default location.
-     * 
-     * @parameter
-     */
-    private File outputDirectory;
-
-    /**
-     * Provides ability to change destination file name
-     * 
-     * @parameter
-     */
-    private String destFileName;
-
-    /**
-     * Force Overwrite..this is the one to set in pom
-     */
-    private String overWrite;
-
-    /**
-     * Force Overwrite
-     */
-    private boolean needsProcessing;
-
-    /**
-     * Artifact Item
-     */
-    private Artifact artifact;
-    
-    /**
-     * A comma separated list of file patterns to include when unpacking the
-     * artifact.
-     */
-    private String includes;
-
-    /**
-     * A comma separated list of file patterns to exclude when unpacking the
-     * artifact.
-     */
-    private String excludes;
-
-    public ArtifactItem()
-    {
-        // default constructor
-    }
-
-    public ArtifactItem( Artifact artifact )
-    {
-        this.setArtifact( artifact );
-        this.setArtifactId( artifact.getArtifactId() );
-        this.setClassifier( artifact.getClassifier() );
-        this.setGroupId( artifact.getGroupId() );
-        this.setType( artifact.getType() );
-        this.setVersion( artifact.getVersion() );
-    }
-
-    private String filterEmptyString( String in )
-    {
-        if ( in == null || in.equals( "" ) )
-        {
-            return null;
-        }
-        else
-        {
-            return in;
-        }
-    }
-
-    /**
-     * @return Returns the artifactId.
-     */
-    public String getArtifactId()
-    {
-        return artifactId;
-    }
-
-    /**
-     * @param artifactId
-     *            The artifactId to set.
-     */
-    public void setArtifactId( String artifact )
-    {
-        this.artifactId = filterEmptyString( artifact );
-    }
-
-    /**
-     * @return Returns the groupId.
-     */
-    public String getGroupId()
-    {
-        return groupId;
-    }
-
-    /**
-     * @param groupId
-     *            The groupId to set.
-     */
-    public void setGroupId( String groupId )
-    {
-        this.groupId = filterEmptyString( groupId );
-    }
-
-    /**
-     * @return Returns the type.
-     */
-    public String getType()
-    {
-        return type;
-    }
-
-    /**
-     * @param type
-     *            The type to set.
-     */
-    public void setType( String type )
-    {
-        this.type = filterEmptyString( type );
-    }
-
-    /**
-     * @return Returns the version.
-     */
-    public String getVersion()
-    {
-        return version;
-    }
-
-    /**
-     * @param version
-     *            The version to set.
-     */
-    public void setVersion( String version )
-    {
-        this.version = filterEmptyString( version );
-    }
-
-    /**
-     * @return Classifier.
-     */
-    public String getClassifier()
-    {
-        return classifier;
-    }
-
-    /**
-     * @param classifier
-     *            Classifier.
-     */
-    public void setClassifier( String classifier )
-    {
-        this.classifier = filterEmptyString( classifier );
-    }
-
-    public String toString()
-    {
-        if ( this.classifier == null )
-        {
-            return groupId + ":" + artifactId + ":" + StringUtils.defaultString( version, "?" ) + ":" + type;
-        }
-        else
-        {
-            return groupId + ":" + artifactId + ":" + classifier + ":" + StringUtils.defaultString( version, "?" )
-                + ":" + type;
-        }
-    }
-
-    /**
-     * @return Returns the location.
-     */
-    public File getOutputDirectory()
-    {
-        return outputDirectory;
-    }
-
-    /**
-     * @param location
-     *            The location to set.
-     */
-    public void setOutputDirectory( File outputDirectory )
-    {
-        this.outputDirectory = outputDirectory;
-    }
-
-    /**
-     * @return Returns the location.
-     */
-    public String getDestFileName()
-    {
-        return destFileName;
-    }
-
-    /**
-     * @param destFileName
-     *            The destFileName to set.
-     */
-    public void setDestFileName( String destFileName )
-    {
-        this.destFileName = filterEmptyString( destFileName );
-    }
-
-    /**
-     * @return Returns the needsProcessing.
-     */
-    public boolean isNeedsProcessing()
-    {
-        return this.needsProcessing;
-    }
-
-    /**
-     * @param needsProcessing
-     *            The needsProcessing to set.
-     */
-    public void setNeedsProcessing( boolean needsProcessing )
-    {
-        this.needsProcessing = needsProcessing;
-    }
-
-    /**
-     * @return Returns the overWriteSnapshots.
-     */
-    public String getOverWrite()
-    {
-        return this.overWrite;
-    }
-
-    /**
-     * @param overWriteSnapshots
-     *            The overWriteSnapshots to set.
-     */
-    public void setOverWrite( String overWrite )
-    {
-        this.overWrite = overWrite;
-    }
-
-    /**
-     * @return Returns the artifact.
-     */
-    public Artifact getArtifact()
-    {
-        return this.artifact;
-    }
-
-    /**
-     * @param artifact
-     *            The artifact to set.
-     */
-    public void setArtifact( Artifact artifact )
-    {
-        this.artifact = artifact;
-    }
-    
-    /**
-     * @return Returns a comma separated list of excluded items
-     */
-    public String getExcludes ()
-    {
-        return this.excludes;
-    }
-    
-    /**
-     * @param excludes 
-     *             A comma seperated list of items to exclude 
-     *             i.e.  **\/*.xml, **\/*.properties
-     */
-    public void setExcludes ( String excludes )
-    {
-        this.excludes = excludes;
-    }
-    
-    /**
-     * @return Returns a comma seperated list of included items
-     */
-    public String getIncludes()
-    {
-        return this.includes;
-    }
-
-    /**
-     * @param includes
-     *             A comma seperated list of items to inmclude 
-     *             i.e.  **\/*.xml, **\/*.properties
-     */
-    public void setIncludes ( String includes )
-    {
-        this.includes = includes;
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/unpack/UnpackMojo.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/unpack/UnpackMojo.java
deleted file mode 100644
index ca146cd..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/unpack/UnpackMojo.java
+++ /dev/null
@@ -1,448 +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.
- */
-
-package org.apache.myfaces.buildtools.maven2.plugin.builder.unpack;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.dependency.utils.filters.ArtifactItemFilter;
-import org.apache.maven.plugin.dependency.utils.filters.MarkerFileFilter;
-import org.apache.maven.plugin.dependency.utils.markers.MarkerHandler;
-import org.apache.maven.plugin.dependency.utils.markers.UnpackFileMarkerHandler;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.IOUtils;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ComponentMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ConverterMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-import org.codehaus.plexus.util.StringUtils;
-
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ValidatorMeta;
-
-/**
- * Goal that retrieves a list of artifacts from the repository and unpacks them
- * in a defined location.
- * <p>
- * This mojo reutilize org.apache.maven.plugin.dependency.fromConfiguration.UnpackMojo
- * from maven-dependency-plugin.
- * </p>
- * <p>
- * The idea of this plugin, instead just unpack a list of artifacts is add some new 
- * features necessary to make easier maintain 1.1 and 1.2 code on myfaces projects like
- * tomahawk.
- * </p>
- * <p>
- * This plugin works as unpack goal of maven-dependency-plugin with 2 additional 
- * enhancements:
- * </p>
- * <ol>
- *  <li>If some file exists on the base directories, it is added as excluded, so it is
- * not copied to the output directory. This makes easier to manage the code and maintain it.</li>
- *  <li>If a file is generated from the model (reading the myfaces-metadata.xml) it is not
- * copied, since this should be generated again.</li>
- * </ol>
- *  
- * @since 1.0
- * @goal unpack
- * @phase process-sources
- * @author Leonardo Uribe
- * @version $Id$
- */
-public class UnpackMojo extends AbstractFromConfigurationMojo
-{
-    /**
-     * Directory where he should check if a file exists or not. If 
-     * exists, he does not copy to , if not he copy it to the output
-     * directory.
-     * 
-     * This is possible because all files on this directory are added
-     * as excluded param.
-     * 
-     * @parameter expression="src/main/java"
-     */
-    private File baseDirectory1;
-    
-    /**
-     * Directory where he should check if a file exists or not. If 
-     * exists, he does not copy to , if not he copy it to the output
-     * directory.
-     * 
-     * This is possible because all files on this directory are added
-     * as excluded param.
-     * 
-     * @parameter 
-     */    
-    private File baseDirectory2;
-        
-    /**
-     * If the plugin should scan the model
-     * 
-     * @optional
-     * @parameter expression="${scanModel}"
-     *            default-value="false"
-     */    
-    private boolean scanModel;
-    
-    /**
-     * Directory to store flag files after unpack
-     * 
-     * @parameter expression="${project.build.directory}/dependency-maven-plugin-markers"
-     */
-    private File markersDirectory;
-    
-    /**
-     * A comma separated list of file patterns to include when unpacking the
-     * artifact.  i.e.  **\/*.xml,**\/*.properties
-     *  @since 2.0-alpha-5
-     * @parameter expression="${mdep.unpack.includes}"
-     */
-    private String includes;
-
-    /**
-     * A comma separated list of file patterns to exclude when unpacking the
-     * artifact.  i.e.  **\/*.xml,**\/*.properties
-     * @since 2.0-alpha-5
-     * @parameter expression="${mdep.unpack.excludes}"
-     */
-    private String excludes;
-
-    /**
-     * Main entry into mojo. This method gets the ArtifactItems and iterates
-     * through each one passing it to unpackArtifact.
-     * 
-     * @throws MojoExecutionException
-     *             with a message if an error occurs.
-     * 
-     * @see ArtifactItem
-     * @see #getArtifactItems
-     * @see #unpackArtifact(ArtifactItem)
-     */
-    public void execute()
-        throws MojoExecutionException
-    {
-        String existingFiles = scanAndAddExistingFilesAsExcluded(
-                baseDirectory1, baseDirectory2);
-        
-        String excludedFiles = null;
-        
-        ArrayList processedItems = getProcessedArtifactItems( false );
-        Iterator iter = processedItems.iterator();
-        while ( iter.hasNext() )
-        {
-            ArtifactItem artifactItem = (ArtifactItem) iter.next();
-            
-            if ( artifactItem.isNeedsProcessing() )
-            {
-                if (scanModel)
-                {
-                    String generatedFiles = this.scanModelAndAddGeneratedFiles(artifactItem);                    
-                    excludedFiles = existingFiles + ','+ generatedFiles;
-                }
-                else
-                {
-                    excludedFiles = existingFiles;
-                }
-                
-                //Exclude existing files on baseDirectory1 and baseDirectory2
-                if (artifactItem.getExcludes() != null)
-                {
-                    artifactItem.setExcludes(artifactItem.getExcludes()+','+excludedFiles);
-                }
-                else
-                {
-                    artifactItem.setExcludes(excludedFiles);
-                }
-                //Unpack
-                unpackArtifact( artifactItem );
-            }
-            else
-            {
-                this.getLog().info( artifactItem.getArtifact().getFile().getName() + " already unpacked." );
-            }
-        }
-    }
-
-    /**
-     * This method gets the Artifact object and calls DependencyUtil.unpackFile.
-     * 
-     * @param artifactItem
-     *            containing the information about the Artifact to unpack.
-     * 
-     * @throws MojoExecutionException
-     *             with a message if an error occurs.
-     * 
-     * @see #getArtifact
-     * @see DependencyUtil#unpackFile(Artifact, File, File, ArchiverManager,
-     *      Log)
-     */
-    private void unpackArtifact( ArtifactItem artifactItem )
-        throws MojoExecutionException
-    {
-        MarkerHandler handler = new UnpackFileMarkerHandler( artifactItem, this.markersDirectory );
-        
-        unpack(
-                artifactItem.getArtifact().getFile(),
-                artifactItem.getOutputDirectory(),
-                artifactItem.getIncludes(),
-                artifactItem.getExcludes());
-        handler.setMarker();
-    }
-
-    ArtifactItemFilter getMarkedArtifactFilter( ArtifactItem item )
-    {
-        MarkerHandler handler = new UnpackFileMarkerHandler( item, this.markersDirectory );
-
-        return new MarkerFileFilter( this.isOverWriteReleases(), this.isOverWriteSnapshots(),
-                                     this.isOverWriteIfNewer(), handler );
-    }
-    
-    protected ArrayList getProcessedArtifactItems(boolean removeVersion)
-        throws MojoExecutionException 
-    {
-        ArrayList items = super.getProcessedArtifactItems( removeVersion );
-        Iterator iter = items.iterator();
-        while ( iter.hasNext() )
-        {
-            ArtifactItem artifactItem = (ArtifactItem) iter.next();
-            if ( StringUtils.isEmpty(artifactItem.getIncludes()) )
-            {
-                artifactItem.setIncludes( getIncludes() );
-            }
-            if ( StringUtils.isEmpty(artifactItem.getExcludes()) )
-            {
-                artifactItem.setExcludes( getExcludes() );
-            }
-        }
-        return items;
-    }
-    
-    protected String scanModelAndAddGeneratedFiles(ArtifactItem artifactItem)
-        throws MojoExecutionException
-    {
-        
-        ArrayList exclusions = new ArrayList();
-        
-        Model model = IOUtils.getModelFromArtifact(artifactItem.getArtifact());
-        
-        if (model != null)
-        {
-            for (Iterator it = model.components(); it.hasNext();)
-            {
-                ComponentMeta component = (ComponentMeta) it.next();
-
-                if (component.getModelId().equals(model.getModelId()))
-                {
-                    if (component.isGeneratedComponentClass().booleanValue())
-                    {
-                        getLog().info("Adding Generated: "+ component.getClassName());
-                        exclusions.add(StringUtils.replace(
-                                component.getClassName(), ".", "/")
-                                + ".java");
-                    }
-                    if (component.isGeneratedTagClass().booleanValue())
-                    {
-                        getLog().info("Adding Generated: "+ component.getTagClass());
-                        exclusions.add(StringUtils.replace(component.getTagClass(),
-                                ".", "/")
-                                + ".java");
-                    }                
-                }
-            }
-            for (Iterator it = model.converters(); it.hasNext();)
-            {
-                ConverterMeta converter = (ConverterMeta) it.next();
-
-                if (converter.getModelId().equals(model.getModelId()))
-                {
-                    if (converter.isGeneratedTagClass().booleanValue())
-                    {
-                        getLog().info("Adding Generated: "+ converter.getTagClass());
-                        exclusions.add(StringUtils.replace(converter.getTagClass(),
-                                ".", "/")
-                                + ".java");
-                    }                
-                }
-            }
-            for (Iterator it = model.validators(); it.hasNext();)
-            {
-                ValidatorMeta validator = (ValidatorMeta) it.next();
-
-                if (validator.getModelId().equals(model.getModelId()))
-                {
-                    if (validator.isGeneratedComponentClass().booleanValue())
-                    {
-                        getLog().info("Adding Generated: "+ validator.getClassName());
-                        exclusions.add(StringUtils.replace(
-                                validator.getClassName(), ".", "/")
-                                + ".java");
-                    }
-                    if (validator.isGeneratedTagClass().booleanValue())
-                    {
-                        getLog().info("Adding Generated: "+ validator.getTagClass());
-                        exclusions.add(StringUtils.replace(validator.getTagClass(),
-                                ".", "/")
-                                + ".java");
-                    }                
-                }
-            }
-            
-        }
-        else
-        {
-            getLog().info("No myfaces-metadata.xml found on artifact.");
-        }
-
-        StringBuilder existingFiles = new StringBuilder();
-        for (int i = 0; i < exclusions.size(); i++)
-        {
-            existingFiles.append(exclusions.get(i));
-            if (i != exclusions.size() - 1)
-            {
-                existingFiles.append(',');
-            }
-        }
-        
-        return existingFiles.toString();
-    }
-    
-    /**
-     * This method scan on both directories and add all files as excluded files to be 
-     * unpacked. Return the resulting filter.
-     * 
-     * @param exclusions
-     * @param dir1
-     * @param dir2
-     * @return
-     */
-    protected String scanAndAddExistingFilesAsExcluded(File dir1, File dir2)
-    {
-        ArrayList exclusions = new ArrayList();
-        
-        if (dir1 != null)
-        {
-            addExcludes(dir1.getPath(), dir1, exclusions);
-        }
-        
-        if (dir2 != null)
-        {
-            addExcludes(dir2.getPath(), dir2, exclusions);
-        }
-        
-        StringBuilder existingFiles = new StringBuilder();
-        for (int i = 0; i < exclusions.size(); i++)
-        {
-            existingFiles.append(exclusions.get(i));
-            if (i != exclusions.size() - 1)
-            {
-                existingFiles.append(',');
-            }
-        }
-        
-        return existingFiles.toString();
-    }
-    
-    protected void addExcludes(String basePath, File f, List exclusions)
-    {
-        
-        if ( f.isDirectory() )
-        {
-            File [] fileList = f.listFiles();
-
-            for (int i = 0; i < fileList.length; ++i)
-            {
-                if (!fileList[i].getName().equals(".svn"))
-                {
-                    addExcludes(basePath,fileList[i], exclusions);
-                }
-            }
-        }
-        else
-        {
-            String path = f.getPath();
-            path = path.replace(basePath,"");
-            while (path.startsWith("/"))
-            {
-                path = path.substring(1);
-            }
-            while (path.startsWith("\\"))
-            {
-                path = path.substring(1);
-            }
-            path = StringUtils.replace( path, "\\", "/" );
-            exclusions.add(path);
-            getLog().info("Adding: "+path);
-        }        
-    }
-
-    /**
-     * @return Returns the markersDirectory.
-     */
-    public File getMarkersDirectory()
-    {
-        return this.markersDirectory;
-    }
-
-    /**
-     * @param theMarkersDirectory
-     *            The markersDirectory to set.
-     */
-    public void setMarkersDirectory( File theMarkersDirectory )
-    {
-        this.markersDirectory = theMarkersDirectory;
-    }
-    
-   
-    /**
-     * @return Returns a comma separated list of excluded items
-     */
-    public String getExcludes ()
-    {
-        return this.excludes;
-    }
-    
-    /**
-     * @param excludes 
-     *          A comma separated list of items to exclude 
-     *          i.e.  **\/*.xml, **\/*.properties
-     */
-    public void setExcludes ( String excludes )
-    {
-        this.excludes = excludes;
-    }
-    
-    /**
-     * @return Returns a comma separated list of included items
-     */
-    public String getIncludes()
-    {
-        return this.includes;
-    }
-
-    /**
-     * @param includes
-     *          A comma separated list of items to include 
-     *          i.e.  **\/*.xml, **\/*.properties
-     */
-    public void setIncludes ( String includes )
-    {
-        this.includes = includes;
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/utils/BuildException.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/utils/BuildException.java
deleted file mode 100644
index 2f0c682..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/utils/BuildException.java
+++ /dev/null
@@ -1,41 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.utils;
-
-
-/**
- * An unchecked exception that can be thrown whenever something goes wrong.
- * <p>
- * An unchecked exception is useful in this particular application because
- * we don't need to bother declaring it everywhere. Checked exceptions are
- * fine here because there is no sensible "recovery strategy" for a build
- * failure except terminating the build.
- */
-public class BuildException extends RuntimeException
-{
-    public BuildException(String msg)
-    {
-        super(msg);
-    }
-    
-    public BuildException(String msg, Exception cause)
-    {
-        super(msg, cause);
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/utils/ConsoleLogSystem.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/utils/ConsoleLogSystem.java
deleted file mode 100644
index 1cc61db..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/utils/ConsoleLogSystem.java
+++ /dev/null
@@ -1,76 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.utils;
-
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.velocity.runtime.RuntimeServices;
-import org.apache.velocity.runtime.log.LogChute;
-
-public class ConsoleLogSystem implements LogChute
-{
-
-    final Logger log = Logger.getLogger(ConsoleLogSystem.class.getName());
-    
-    public Logger getLogger()
-    {
-        return log;
-    }
-    
-    public void init(RuntimeServices runtimeservices) throws Exception
-    {
-        return;
-    }
-
-    public boolean isLevelEnabled(int i)
-    {
-        return true;
-    }
-
-    public void log(int level, String message)
-    {
-        switch ( level )
-        {
-            case LogChute.WARN_ID:
-                getLogger().log(Level.WARNING, message );
-                break;
-            case LogChute.INFO_ID:
-                // velocity info messages are too verbose, just consider them as debug messages...
-                getLogger().log(Level.INFO, message );
-                break;
-            case LogChute.DEBUG_ID:
-                getLogger().log(Level.FINE, message );
-                break;
-            case LogChute.ERROR_ID:
-                getLogger().log(Level.SEVERE, message );
-                break;
-            default:
-                getLogger().log(Level.ALL, message );
-                break;
-        }        
-    }
-
-    public void log(int level, String message, Throwable throwable)
-    {
-        log(level,message);
-        throw new RuntimeException(throwable);
-    }
-
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/utils/MyfacesUtils.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/utils/MyfacesUtils.java
deleted file mode 100644
index 17a435d..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/utils/MyfacesUtils.java
+++ /dev/null
@@ -1,745 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.utils;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ComponentMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.MethodSignatureMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.PropertyMeta;
-
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.PropertyHolder;
-
-/**
- * Collection of useful utility methods.
- * <p>
- * An instance of this type is made available to the templates used to generate
- * output files, so that they can call these useful methods.
- */
-public class MyfacesUtils
-{
-    public MyfacesUtils()
-    {
-    }
-
-    public static String getPrefixedPropertyName(String prefix,
-            String propertyName)
-    {
-        return prefix + Character.toUpperCase(propertyName.charAt(0))
-                + propertyName.substring(1);
-    }
-    
-    /**
-     * Convert h:commandButton to commandButton
-     * 
-     * @param prefixedName
-     * @return
-     */
-    public static String getTagName(String prefixedName)
-    {
-        return prefixedName.substring(prefixedName.indexOf(':')+1); 
-    }
-    
-    public static String getTagPrefix(String prefixedName)
-    {
-        return prefixedName.substring(0,prefixedName.indexOf(':'));
-    }
-
-    public static String getJspPropertyType11(PropertyMeta property)
-    {
-//        if (property.isMethodExpression())
-//            return "MethodBinding";
-
-//        if (property.isMethodBinding())
-//            return "MethodBinding";
-        //On 1.1 all properties is mapped as String
-        return "String";
-    }
-    
-    public static String getFullJspPropertyType11(PropertyMeta property)
-    {
-        if (property.isMethodExpression())
-        {
-            return "javax.faces.el.MethodBinding";
-        }
-
-        if (property.isMethodBinding())
-        {
-            return "javax.faces.el.MethodBinding";
-        }
-
-        return "java.lang.String";
-    }
-    
-
-    public static String getJspPropertyType12(PropertyMeta property)
-    {
-        if (property.getJspName().equals("actionListener"))
-        {
-            return "javax.el.MethodExpression";
-        }
-        if (property.getJspName().equals("validator"))
-        {
-            return "javax.el.MethodExpression";
-        }
-        if (property.getJspName().equals("valueChangeListener"))
-        {
-            return "javax.el.MethodExpression";
-        }
-        
-        if (property.isMethodExpression())
-        {
-            return "MethodExpression";
-        }
-
-        if (property.isMethodBinding())
-        {
-            return "MethodBinding";
-        }
-
-        if (!property.isLiteralOnly().booleanValue())
-        {
-            return "ValueExpression";
-        }
-        else
-        {
-            return property.getClassName();
-        }
-    }
-
-    public static String getVariableFromName(String name)
-    {
-        if (name == null)
-        {
-            return null;
-        }
-
-        if (RESERVED_WORDS.contains(name))
-        {
-            name = name + "Param";
-        }
-
-        return name;
-    }
-
-    // TODO: perhaps this could just return a list of class names for
-    // templates to iterate over, rather than building the text itself?
-    //
-    // TODO: why are we importing tag classes into components anyway?
-    public static String importTagClasses(PropertyHolder component)
-    {
-        Set imports = new HashSet();
-        for (Iterator it = component.properties(); it.hasNext();)
-        {
-            PropertyMeta property = (PropertyMeta) it.next();
-            if (property.getClassName() != null && 
-                    !PRIMITIVE_TYPES.contains(property.getClassName()))
-            {
-                if (!property.getClassName().startsWith("java.lang"))
-                {
-                    imports.add(property.getClassName());
-                }
-            }
-        }
-
-        StringBuilder value = new StringBuilder();
-
-        for (Iterator importIterator = imports.iterator(); importIterator
-                .hasNext();)
-        {
-            value.append("import ");
-            value.append((String) importIterator.next());
-            value.append(';');
-            value.append('\n');
-        }
-
-        return value.toString();
-    }
-    
-    public static String importTagClasses12(ComponentMeta component)
-    {
-        Set imports = new HashSet();
-        for (Iterator it = component.properties(); it.hasNext();)
-        {
-            PropertyMeta property = (PropertyMeta) it.next();
-            if (property.getClassName() != null && 
-                    !PRIMITIVE_TYPES.contains(property.getClassName()))
-            {
-                if (!property.getClassName().startsWith("java.lang"))
-                {
-                    imports.add(property.getClassName());
-                }
-            }
-            if (property.getJspName().equals("actionListener"))
-            {
-                imports.add("javax.faces.event.MethodExpressionActionListener");
-            }
-            if (property.getJspName().equals("valueChangeListener"))
-            {
-                imports.add("javax.faces.event.MethodExpressionValueChangeListener");
-            }
-            if (property.getJspName().equals("validator"))
-            {
-                imports.add("javax.faces.validator.MethodExpressionValidator");
-            }
-        }
-
-        StringBuilder value = new StringBuilder();
-
-        for (Iterator importIterator = imports.iterator(); importIterator
-                .hasNext();)
-        {
-            value.append("import ");
-            value.append((String) importIterator.next());
-            value.append(';');
-            value.append('\n');
-        }
-
-        return value.toString();
-    }
-    
-
-    public static boolean isConverter(String propClass)
-    {
-        return ("javax.faces.convert.Converter".equals(propClass));
-    }
-    
-    public static boolean isList(String propClass)
-    {
-        if (propClass == null)
-        {
-            return false;
-        }
-        else if(propClass.contains("List"))
-        {
-            return true;
-        }
-        else
-        {
-            return false;
-        }
-    }
-    
-    public static String castIfNecessary(String propClass)
-    {
-      if (propClass.equals("Object") || propClass.equals("java.lang.Object"))
-      {
-        return "";
-      }
-
-      if (isPrimitiveClass(propClass))
-      {
-        propClass = getBoxedClass(propClass);
-      }
-
-      return "(" + propClass + ")";
-    }    
-        
-    public static String getBoxedClass(String className)
-    {
-        if ("boolean".equals(className))
-        {
-            return "Boolean";
-        }
-        else if ("byte".equals(className))
-        {
-            return "Byte";
-        }
-        else if ("char".equals(className))
-        {
-            return "Character";
-        }
-        else if ("double".equals(className))
-        {
-            return "Double";
-        }
-        else if ("float".equals(className))
-        {
-            return "Float";
-        }
-        else if ("int".equals(className))
-        {
-            return "Integer";
-        }
-        else if ("long".equals(className))
-        {
-            return "Long";
-        }
-        else if ("short".equals(className))
-        {
-            return "Short";
-        }
-        else
-        {
-            return className;
-        }
-    }
-    
-    public static String getSignatureParams(MethodSignatureMeta signature)
-    {
-        String[] paramTypes = (signature != null) ? signature.getParameterTypes() : null;
-
-        String classArray;
-
-        if (paramTypes == null || paramTypes.length == 0)
-        {
-          classArray = "new Class[0]";
-        }
-        else
-        {
-          StringBuffer sb = new StringBuffer();
-          sb.append("new Class[]{");
-          for (int i = 0; i < paramTypes.length; i++)
-          {
-            if (i > 0)
-            {
-              sb.append(',');
-            }
-            sb.append(paramTypes[i]);
-            sb.append(".class");
-          }
-
-          // TODO: remove trailing comma
-          sb.append(',');
-
-          sb.append('}');
-          classArray = sb.toString();
-        }
-        return classArray;
-    }
-    
-    public static boolean isStringMethodBindingReturnType(MethodSignatureMeta sig)
-    {
-        return (sig != null && "java.lang.String".equals(sig.getReturnType()));
-    }
-    
-    static public String getMethodReaderFromProperty(String propertyName,
-            String propertyClass)
-    {
-        String methodPrefix = ("boolean".equals(propertyClass) ? "is" : "get");
-        return getPrefixedPropertyName(methodPrefix, propertyName);
-    }
-    
-    public static String getPrimitiveType(String className)
-    {
-        if (className.startsWith("java.lang."))
-        {
-            className = className.replace("java.lang.", "");
-        }
-
-        if (className.endsWith("eger"))
-        {
-            className = className.replace("eger", "");
-        }
-
-        if (MyfacesUtils.isPrimitiveClass(className.toLowerCase()))
-        {
-            return className.toLowerCase();
-        }
-        else
-        {
-            return className;
-        }
-    }    
-    
-    public static boolean isPrimitiveClass(String className)
-    {
-        return "boolean".equals(className) || "byte".equals(className)
-                || "char".equals(className) || "double".equals(className)
-                || "float".equals(className) || "int".equals(className)
-                || "long".equals(className) || "short".equals(className);
-    }
-
-    private static Set _createPrimitiveTypesSet()
-    {
-        Set primitives = new TreeSet();
-        for (int i = 0; i < _PRIMITIVE_TYPES.length; i++)
-        {
-            String type = _PRIMITIVE_TYPES[i];
-            primitives.add(type);
-            primitives.add(type + "[]");
-        }
-        return Collections.unmodifiableSet(primitives);
-    }
-
-    private static Set _createReservedWordsSet()
-    {
-        Set reserved = new TreeSet();
-        for (int i = 0; i < _RESERVED_WORDS.length; i++)
-        {
-            String keyword = _RESERVED_WORDS[i];
-            reserved.add(keyword);
-        }
-        return Collections.unmodifiableSet(reserved);
-    }
-
-    static private final String[] _PRIMITIVE_TYPES = new String[] {
-        // TODO: Shouldn't java.lang.* be specified in that list as well?
-    "boolean", "byte", "char", "float", "double", "int", "short", "long", };
-
-    static private final String[] _RESERVED_WORDS = new String[] { "abstract",
-            "assert", "boolean", "break", "byte", "case", "catch", "char",
-            "class", "const", "continue", "default", "do", "double", "else",
-            "extends", "final", "finally", "float", "for", "goto", "if",
-            "implements", "import", "instanceof", "int", "interface", "long",
-            "native", "new", "package", "private", "protected", "public",
-            "return", "short", "static", "super", "switch", "synchronized",
-            "this", "throw", "throws", "transient", "try", "void", "volatile",
-            "while", };
-
-    static public final Set RESERVED_WORDS = _createReservedWordsSet();
-    static public final Set PRIMITIVE_TYPES = _createPrimitiveTypesSet();
-
-    static private final Pattern _GENERIC_TYPE = Pattern
-            .compile("([^<]+)<(.+)>");
-    
-    //UNUSED METHODS
-
-
-    static public String convertClassToSourcePath(String className,
-            String fileExtension)
-    {
-        return (className.replace('.', File.separatorChar) + fileExtension);
-    }
-
-    static public boolean isFullClass(String className)
-    {
-        return (className != null && className.indexOf('.') != -1);
-    }
-
-    /*
-    public static String getGenericsFromProperty(PropertyMeta property){
-        String gen = "";
-        for (int i = 0; i < property.getAttributeClassParameters().length; i++) {
-            if (i>0){
-                gen += ",";
-            }
-            gen += getClassFromFullClass(property.getAttributeClassParameters()[i]);          
-        }
-        return (gen.length() > 0?"<"+gen+">":gen);
-    }
-    */
-
-    /**
-     * Extract the simple class name from a fully-qualified classname.
-     * <p>
-     * Given a string like "org.apache.Foo", this method returns "Foo".
-     */
-    static public String getClassFromFullClass(String fullClass)
-    {
-        if (fullClass == null)
-        {
-            return null;
-        }
-
-        int lastSep = fullClass.lastIndexOf('.');
-        // Note: this code also works for the empty package
-        return (fullClass.substring(lastSep + 1));
-    }
-
-    static public String getPackageFromFullClass(String fullClass)
-    {
-        if (fullClass == null)
-        {
-            return null;
-        }
-
-        int lastSep = fullClass.lastIndexOf('.');
-
-        // detect the empty package
-        if (lastSep == -1)
-        {
-            return "";
-        }
-
-        return (fullClass.substring(0, lastSep));
-    }
-
-    static public String getConstantNameFromProperty(String propertyName)
-    {
-        return getConstantNameFromProperty(propertyName, null);
-    }
-
-    static public String getConstantNameFromProperty(String propertyName,
-            String constantSuffix)
-    {
-        StringBuffer constantName = new StringBuffer();
-
-        for (int i = 0; i < propertyName.length(); i++)
-        {
-            char ch = propertyName.charAt(i);
-            if (i > 0 && Character.isUpperCase(ch)
-                    && Character.isLowerCase(propertyName.charAt(i - 1)))
-            {
-                constantName.append('_');
-            }
-            ch = Character.toUpperCase(ch);
-            constantName.append(ch);
-        }
-
-        if (constantSuffix != null)
-        {
-            constantName.append(constantSuffix);
-        }
-
-        return constantName.toString();
-    }
-
-    static public String getPropertyClass(PropertyMeta property)
-    {
-        String propertyFullClass = property.getClassName();
-        String propertyClass = MyfacesUtils
-                .getClassFromFullClass(propertyFullClass);
-        /*
-        String[] genericTypes = property.getPropertyClassParameters();
-        if(genericTypes != null && genericTypes.length > 0)
-        {
-          StringBuffer buffer = new StringBuffer(60);
-          buffer.append(propertyClass);
-          buffer.append('<');
-          int max = genericTypes.length - 1;
-          for(int i = 0; i <= max; i++)
-          {
-            _buildPropertyClass(buffer, genericTypes[i]);
-            if(i < max)
-            {
-              buffer.append(", ");
-            }
-          }
-          buffer.append('>');
-          
-          propertyClass = buffer.toString();
-        }*/
-
-        return propertyClass;
-    }
-
-    static public String getMethodNameFromEvent(String methodPrefix,
-            String eventName, String methodSuffix)
-    {
-        return methodPrefix + Character.toUpperCase(eventName.charAt(0))
-                + eventName.substring(1) + methodSuffix;
-    }
-
-    static public String getEventNameFromEventType(String eventFullClass)
-    {
-        String eventName = getClassFromFullClass(eventFullClass);
-        return Character.toLowerCase(eventName.charAt(0))
-                + eventName.substring(1, eventName.length());
-    }
-    
-    /*
-    static public String getAlternatePropertyClass(PropertyMeta property)
-    {
-      StringBuffer buffer = new StringBuffer(60);
-      _buildPropertyClass(buffer, property.getAlternateClass());
-      
-      return buffer.toString();
-    }
-    */
-
-    static public String primitiveDefaultValue(String className)
-    {
-        if ("boolean".equals(className))
-        {
-            return "false";
-        }
-        else if ("byte".equals(className))
-        {
-            return "0";
-        }
-        else if ("char".equals(className))
-        {
-            return "''";
-        }
-        else if ("double".equals(className))
-        {
-            return "0.0d";
-        }
-        else if ("float".equals(className))
-        {
-            return "0.0f";
-        }
-        else if ("int".equals(className))
-        {
-            return "0";
-        }
-        else if ("long".equals(className))
-        {
-            return "0L";
-        }
-        else if ("short".equals(className))
-        {
-            return "0";
-        }
-        else
-        {
-            return className;
-        }
-    }
-
-    static public String fill(String base, int length)
-    {
-        if (base == null || base.length() > length)
-        {
-            return base;
-        }
-
-        StringBuffer filled = new StringBuffer(base);
-        for (int i = base.length(); i < length; i++)
-        {
-            filled.append(' ');
-        }
-        return filled.toString();
-    }
-
-    static public String getVariableFromClass(String className)
-    {
-        if (className == null)
-        {
-            return null;
-        }
-
-        for (int i = 0; i < className.length(); i++)
-        {
-            char ch = className.charAt(i);
-            if (Character.isLowerCase(ch))
-            {
-                if (i > 0)
-                {
-                    return Character.toLowerCase(className.charAt(i - 1))
-                            + className.substring(i);
-                }
-                break;
-            }
-        }
-
-        throw new IllegalStateException("Class name \"" + className
-                + "\" does not use initcaps");
-    }
-
-    static public String convertStringToLiteral(String value)
-    {
-        return convertStringToLiteral("String", value);
-    }
-
-    static public String convertStringToLiteral(String className, String value)
-    {
-        if (value == null)
-        {
-            return null;
-        }
-        else if ("String".equals(className))
-        {
-            return "\"" + value.replaceAll("\'", "\\'") + "\"";
-        }
-        else if ("Number".equals(className))
-        {
-            // Double vs. Integer.
-            if (value.indexOf(".") == -1)
-            {
-                return "Integer.valueOf(" + value + ")";
-            }
-            else
-            {
-                return "Double.valueOf(" + value + ")";
-            }
-        }
-        else
-        {
-            return value;
-        }
-    }
-
-    static public String getDefaultValue(PropertyMeta property)
-    {
-        String propertyFullClass = property.getClassName();
-        String def = property.getDefaultValue();
-        if (def == null || def.length() == 0)
-        {
-            return null;
-        }
-        if (isPrimitiveClass(propertyFullClass))
-        {
-            return def;
-        }
-        else if ("java.lang.String".equals(propertyFullClass))
-        {
-            if (def.startsWith("\"") && def.endsWith("\""))
-            {
-                return def;
-            }
-            else
-            {
-                return "\"" + def + "\"";
-            }
-        }
-        else
-        {
-            //Any other class, so we return the default value
-            return def;
-        }
-    }
-    
-    public static String getDefaultValueField(PropertyMeta property)
-    {
-        String def =  getDefaultValue(property);
-
-        if (property.getClassName().endsWith("Boolean") && def != null)
-        {
-                def = "Boolean.valueOf("+def+")";
-        }
-        return def;
-    }
-
-    static private void _buildPropertyClass(StringBuffer buffer, String type)
-    {
-        Matcher matcher = _GENERIC_TYPE.matcher(type);
-        if (matcher.matches())
-        {
-            // Generic type
-            buffer.append(MyfacesUtils.getClassFromFullClass(matcher.group(1)));
-            buffer.append('<');
-            String[] types = matcher.group(2).split(",");
-            int max = types.length - 1;
-            for (int i = 0; i <= max; i++)
-            {
-                _buildPropertyClass(buffer, types[i]);
-                if (i < max)
-                {
-                    buffer.append(", ");
-                }
-            }
-            buffer.append('>');
-        }
-        else
-        {
-            // Non-generic type
-            buffer.append(MyfacesUtils.getClassFromFullClass(type));
-        }
-    }
-
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/utils/RelativeClasspathResourceLoader.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/utils/RelativeClasspathResourceLoader.java
deleted file mode 100644
index 4539451..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/builder/utils/RelativeClasspathResourceLoader.java
+++ /dev/null
@@ -1,149 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.utils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.collections.ExtendedProperties;
-import org.apache.commons.lang.StringUtils;
-import org.apache.velocity.exception.ResourceNotFoundException;
-import org.apache.velocity.runtime.resource.Resource;
-import org.apache.velocity.runtime.resource.loader.ResourceLoader;
-import org.apache.velocity.util.ClassUtils;
-import org.apache.velocity.util.ExceptionUtils;
-
-/**
- * This class extends ClasspathResourceLoader adding the feature
- * of configure a path inside the classpath for load resources.
- * 
- * @author Leonardo
- *
- */
-public class RelativeClasspathResourceLoader extends ResourceLoader
-{
-
-    private List paths = new ArrayList();
-
-    public void init(ExtendedProperties configuration)
-    {
-        if (log.isTraceEnabled())
-        {
-            log
-                    .trace("RelativeClasspathResourceLoader : initialization complete.");
-        }
-
-        paths.addAll(configuration.getVector("path"));
-
-        // trim spaces from all paths
-        org.apache.velocity.util.StringUtils.trimStrings(paths);
-        if (log.isInfoEnabled())
-        {
-            // this section lets tell people what paths we will be using
-            int sz = paths.size();
-            for (int i = 0; i < sz; i++)
-            {
-                log.info("RelativeClasspathResourceLoader : adding path '"
-                        + (String) paths.get(i) + "'");
-            }
-            log
-                    .trace("RelativeClasspathResourceLoader : initialization complete.");
-        }
-    }
-
-    public InputStream getResourceStream(String name)
-            throws ResourceNotFoundException
-    {
-        if (StringUtils.isEmpty(name))
-        {
-            throw new ResourceNotFoundException("No template name provided");
-        }
-
-        /**
-         * look for resource in thread classloader first (e.g. WEB-INF\lib in
-         * a servlet container) then fall back to the system classloader.
-         */
-
-        int size = paths.size();
-        for (int i = 0; i < size; i++)
-        {
-            String path = (String) paths.get(i);
-            InputStream inputStream = null;
-
-            try
-            {
-                inputStream = findTemplate(path, name);
-            }
-            catch (IOException ioe)
-            {
-                log.error("While loading Template " + name + ": ", ioe);
-            }
-
-            if (inputStream != null)
-            {
-                return inputStream;
-            }
-        }
-        String msg = "ClasspathResourceLoader Error: cannot find resource "
-                + name;
-
-        throw new ResourceNotFoundException(msg);
-    }
-
-    private InputStream findTemplate(final String path, final String name)
-            throws IOException
-    {
-        InputStream result = null;
-
-        try
-        {
-            result = ClassUtils.getResourceAsStream(getClass(), path + "/"
-                    + name);
-        }
-        catch (Exception fnfe)
-        {
-            throw (ResourceNotFoundException) ExceptionUtils.createWithCause(
-                    ResourceNotFoundException.class, "problem with template: "
-                            + name, fnfe);
-        }
-
-        if (result == null)
-        {
-            String msg = "ClasspathResourceLoader Error: cannot find resource "
-                    + name;
-
-            throw new ResourceNotFoundException(msg);
-        }
-
-        return result;
-    }
-
-    public boolean isSourceModified(Resource resource)
-    {
-        return false;
-    }
-
-    public long getLastModified(Resource resource)
-    {
-        return 0;
-    }
-
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/tagdoc/TagdocContentMojo.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/tagdoc/TagdocContentMojo.java
deleted file mode 100644
index 3bf6f54..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/tagdoc/TagdocContentMojo.java
+++ /dev/null
@@ -1,885 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.tagdoc;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeSet;
-
-import org.apache.commons.digester.AbstractObjectCreationFactory;
-import org.apache.maven.artifact.DependencyResolutionRequiredException;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.reporting.MavenReportException;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.Flattener;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.IOUtils;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ClassMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ComponentMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ConverterMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.TagMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ValidatorMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.utils.MyfacesUtils;
-import org.apache.velocity.Template;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.app.VelocityEngine;
-import org.apache.velocity.context.Context;
-import org.apache.velocity.runtime.RuntimeConstants;
-import org.apache.velocity.runtime.resource.ResourceManagerImpl;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.xml.Xpp3Dom;
-import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
-import org.codehaus.plexus.util.xml.Xpp3DomWriter;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-import org.xml.sax.Attributes;
-
-/**
- * 
- * Generate the tag doc content pages using velocity. This is done before
- * site, because maven-site-plugin use velocity and if we do this inside 
- * report generation, we cause a ClassLoader problem.
- * 
- * @author Leonardo Uribe
- * @goal tagdoc-content
- * @phase generate-resources
- */
-public class TagdocContentMojo extends AbstractMojo
-{
-    private Model _model;
-
-    /**
-     * Specifies the directory where the report will be generated
-     *
-     * @parameter default-value="${project.reporting.outputDirectory}"
-     * @required
-     */
-    private File outputDirectory;
-
-    /**
-     * Directory where the original site is present.
-     * (TRIED using ${baseDir}/src/site;  that inserted a 'null' into
-     * the string for some reason.  TRIED using ${siteDirectory},
-     * which was undefined.  TRIED ${project.directory}src/site; which also
-     * inserted a null.  ${project.build.directory}/../src/site seems to work,
-     * though it assumes that ${project.build.directory} is 
-     * ${project.directory}/target.
-     * 
-     * @parameter default-value="${project.build.directory}/../src/site/"
-     * @required
-     */
-    private File siteDirectory;
-
-    /**
-     * @parameter expression="${project}"
-     * @required
-     * @readonly
-     */
-    private MavenProject project;
-
-    /**
-     * @parameter
-     */
-    private Map taglibs;
-        
-    /**
-     * @parameter expression="${project.build.directory}/myfaces-builder-plugin/main/resources"
-     * @readonly
-     */
-    private File buildDirectory;
-
-    /**
-     * Injected name of file generated by earlier run of BuildMetaDataMojo goal.
-     * 
-     * @parameter
-     */
-    private String metadataFile = "META-INF/myfaces-metadata.xml";
-    
-    /**
-     * @parameter expression="src/main/resources/META-INF"
-     */
-    private File templateSourceDirectory;
-    
-    /**
-     * @parameter expression="src/main/tagdoc"
-     */    
-    private File baseFilesSourceDirectory;
-    
-    /**
-     * @parameter
-     */
-    private List modelIds;
-    
-    /**
-     * @parameter expression="xdoc-component.vm"
-     */
-    private String templateComponent;
-    
-    /**
-     * @parameter expression="xdoc-converter.vm"
-     */
-    private String templateConverter;
-    
-    /**
-     * @parameter expression="xdoc-validator.vm"
-     */
-    private String templateValidator;
-        
-    /**
-     * @parameter expression="xdoc-tag.vm"
-     */
-    private String templateTag;
-
-    static private final String _DOC_SUBDIRECTORY = "tagdoc";
-
-    public void execute() throws MojoExecutionException, MojoFailureException
-    {
-        if (modelIds == null)
-        {
-            modelIds = new ArrayList();
-            modelIds.add(project.getArtifactId());
-        }
-        
-        if (taglibs == null)
-        {
-            taglibs = new HashMap();
-            taglibs.put("t", "http://myfaces.apache.org/tomahawk");
-        }
-        
-        try
-        {
-            _model = IOUtils.loadModel(new File(buildDirectory,
-                    metadataFile));
-            new Flattener(_model).flatten();            
-            _generateTagDocs();
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException("Couldn't generate tagdoc", e);
-        }        
-    }
-    
-    public boolean canGenerate(ClassMeta component)
-    {
-        if ( modelIds.contains(component.getModelId()))
-        {
-            return true;
-        }
-        else
-        {
-            return false;
-        }
-    }
-    
-    public class CustomResourceManagerImpl extends ResourceManagerImpl
-    {
-        public CustomResourceManagerImpl()
-        {
-            super();
-        }
-    }
-    
-    private VelocityEngine initVelocity() throws MojoExecutionException
-    {        
-        Properties p = new Properties();
-        p.setProperty( "resource.loader", "file, class" );
-        p.setProperty( "file.resource.loader.class",
-                "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
-        p.setProperty( "file.resource.loader.path", templateSourceDirectory.getPath());
-        p.setProperty( "class.resource.loader.class",
-                "org.apache.myfaces.buildtools.maven2.plugin.builder.utils.RelativeClasspathResourceLoader" );
-        p.setProperty( "class.resource.loader.path", "META-INF");                    
-        p.setProperty( "velocimacro.library", "componentClassMacros11.vm");
-        p.setProperty( "velocimacro.permissions.allow.inline","true");
-        p.setProperty( "velocimacro.permissions.allow.inline.local.scope", "true");
-        p.setProperty( "directive.foreach.counter.initial.value","0");
-        p.setProperty( RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
-        "org.apache.myfaces.buildtools.maven2.plugin.builder.utils.ConsoleLogSystem" );
-                        
-        VelocityEngine velocityEngine = new VelocityEngine();
-                
-        try
-        {
-            velocityEngine.init(p);
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException("Error creating VelocityEngine", e);
-        }
-        
-        return velocityEngine;
-                
-    }
-            
-    private void _generateTagDocs() throws Exception
-    {
-        Model model = getModel();
-        if (model.getComponents().size() == 0)
-        {
-            getLog().info("Nothing to generate - no components found");
-            return;
-        }
-        
-        VelocityEngine velocityEngine = initVelocity();
-        
-        VelocityContext baseContext = new VelocityContext();
-        baseContext.put("utils", new MyfacesUtils());
-        baseContext.put("tagdocUtils", new TagdocUtils());
-        baseContext.put("model",getModel());
-        
-        Iterator components = model.components();
-
-        Iterator validators = model.validators();
-
-        Iterator converters = model.converters();
-        
-        Iterator tags = model.tags();
-
-        Set componentPages = new TreeSet();
-        Set converterPages = new TreeSet();
-        Set validatorPages = new TreeSet();
-        Set tagsPages = new TreeSet();
-
-        int count = 0;
-        while (components.hasNext())
-        {
-            ComponentMeta component = (ComponentMeta) components.next();
-            if (canGenerate(component))
-            {                
-                String pageName = _generateComponentDoc(velocityEngine,baseContext,component);
-                if (pageName != null)
-                {
-                    componentPages.add(pageName);
-                    count++;
-                }
-            }
-        }
-        while (converters.hasNext())
-        {
-            ConverterMeta converter = (ConverterMeta) converters.next();
-            if (canGenerate(converter))
-            {
-                String pageName = _generateConverterDoc(velocityEngine,baseContext,converter);
-                if (pageName != null)
-                {
-                    converterPages.add(pageName);
-                    count++;
-                }
-            }
-        }
-        while (validators.hasNext())
-        {
-            ValidatorMeta validator = (ValidatorMeta) validators.next();
-            
-            if (canGenerate(validator))
-            {
-                String pageName = _generateValidatorDoc(velocityEngine,baseContext,validator);
-                if (pageName != null)
-                {
-                    validatorPages.add(pageName);
-                    count++;
-                }
-            }
-        }
-        while (tags.hasNext())
-        {
-            TagMeta tag = (TagMeta) tags.next();
-            
-            if (canGenerate(tag))
-            {
-                String pageName = _generateTagDoc(velocityEngine,baseContext,tag);
-                if (pageName != null)
-                {
-                    tagsPages.add(pageName);
-                    count++;
-                }                
-            }
-        }
-
-        Set otherPages = _gatherOtherTags();
-
-        getLog().info("Generated " + count + " page(s)");
-    }
-
-    private Set _gatherOtherTags()
-    {
-        TreeSet set = new TreeSet();
-        String subDir = _platformAgnosticPath(_platformAgnosticPath("xdoc/"
-                + _DOC_SUBDIRECTORY));
-        File siteSubDir = new File(siteDirectory, subDir);
-        if (siteSubDir.exists())
-        {
-            String[] files = siteSubDir.list();
-            for (int i = 0; i < files.length; i++)
-            {
-                String file = files[i];
-                if (file.endsWith(".xml"))
-                {
-                    set.add(file.substring(0, file.length() - 4));
-                }
-            }
-        }
-
-        return set;
-    }
-
-    public boolean usePageLinkBar()
-    {
-        return false;
-    }
-
-    private String _toPageName(String qName)
-    {
-        return MyfacesUtils.getTagPrefix(qName) + "_" + MyfacesUtils.getTagName(qName);
-    }
-
-    private String _generateComponentDoc(VelocityEngine velocityEngine, 
-            VelocityContext baseContext, ComponentMeta component)
-            throws Exception
-    {
-        if (component.getName() == null)
-        {
-            return null;
-        }
-        String pageName = _toPageName(component.getName());
-        
-        Context context = new VelocityContext(baseContext);
-        context.put("component", component);
-        
-        String baseContent = "";
-        
-        File xmlBaseFile = new File(baseFilesSourceDirectory, 
-                _platformAgnosticPath(pageName + "-base.xml"));
-        
-        if (xmlBaseFile != null && xmlBaseFile.exists())
-        {
-            if (getLog().isDebugEnabled())
-            {
-                getLog().debug("using base content file: "+xmlBaseFile.getPath());
-            }
-            
-            Reader reader = null;
-            try
-            {
-                reader = new FileReader(xmlBaseFile);
-                Xpp3Dom root = Xpp3DomBuilder.build(reader);
-                
-                StringWriter writer = new StringWriter();
-                
-                Xpp3Dom [] children = root.getChild("body").getChildren();
-                
-                for (int i = 0; i< children.length; i++)
-                {
-                    Xpp3Dom dom = children[i];
-                    Xpp3DomWriter.write(writer, dom);
-                }
-                baseContent = writer.toString();
-                writer.close();
-            }
-            catch (XmlPullParserException e)
-            {
-                throw new MojoExecutionException(
-                        "Error parsing base file: " + e.getMessage(), e);
-            }
-            finally
-            {
-                reader.close();
-            }
-        }
-        
-        baseContext.put("baseContent", baseContent);        
-        
-        Writer out = null;
-        
-        try
-        {        
-            File targetDir = new File(outputDirectory.getParentFile(),
-                    _platformAgnosticPath("generated-site/xdoc/"
-                            + _DOC_SUBDIRECTORY));
-            
-            if ( !targetDir.exists() )
-            {
-                targetDir.mkdirs();
-            }
-            File targetFile = new File(targetDir, pageName + ".xml");
-    
-            out = new OutputStreamWriter(new FileOutputStream(targetFile),
-                    "UTF-8");
-            
-            Template template = velocityEngine.getTemplate(getTemplateComponent());
-            
-            template.merge(context, out);
-            
-            out.flush();
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException(
-                    "Error merging velocity templates: " + e.getMessage(), e);
-        }
-        finally
-        {
-            IOUtil.close(out);
-            out = null;
-        }
-
-        return pageName;
-    }
-
-    private String _generateConverterDoc(VelocityEngine velocityEngine, 
-            VelocityContext baseContext, ConverterMeta converter)
-            throws Exception
-    {
-        if (converter.getName() == null)
-        {
-            return null;
-        }
-
-        String pageName = _toPageName(converter.getName());
-        
-        Context context = new VelocityContext(baseContext);
-        context.put("converter", converter);
-        
-        String baseContent = "";
-        
-        File xmlBaseFile = new File(baseFilesSourceDirectory, 
-                _platformAgnosticPath(pageName + "-base.xml"));
-        
-        if (xmlBaseFile != null && xmlBaseFile.exists())
-        {
-            if (getLog().isDebugEnabled())
-            {
-                getLog().debug("using base content file: "+xmlBaseFile.getPath());
-            }
-            
-            Reader reader = null;
-            try
-            {
-                reader = new FileReader(xmlBaseFile);
-                Xpp3Dom root = Xpp3DomBuilder.build(reader);
-                
-                StringWriter writer = new StringWriter();
-                
-                Xpp3Dom [] children = root.getChild("body").getChildren();
-                
-                for (int i = 0; i< children.length; i++)
-                {
-                    Xpp3Dom dom = children[i];
-                    Xpp3DomWriter.write(writer, dom);
-                }
-                baseContent = writer.toString();
-                writer.close();
-            }
-            catch (XmlPullParserException e)
-            {
-                throw new MojoExecutionException(
-                        "Error parsing base file: " + e.getMessage(), e);
-            }
-            finally
-            {
-                reader.close();
-            }
-        }
-        
-        baseContext.put("baseContent", baseContent);        
-        
-        Writer out = null;
-        
-        try
-        {        
-            File targetDir = new File(outputDirectory.getParentFile(),
-                    _platformAgnosticPath("generated-site/xdoc/"
-                            + _DOC_SUBDIRECTORY));
-            
-            if ( !targetDir.exists() )
-            {
-                targetDir.mkdirs();
-            }
-            File targetFile = new File(targetDir, pageName + ".xml");
-    
-            out = new OutputStreamWriter(new FileOutputStream(targetFile),
-                    "UTF-8");
-            
-            Template template = velocityEngine.getTemplate(getTemplateConverter());
-            
-            template.merge(context, out);
-            
-            out.flush();
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException(
-                    "Error merging velocity templates: " + e.getMessage(), e);
-        }
-        finally
-        {
-            IOUtil.close(out);
-            out = null;
-        }
-
-        return pageName;
-    }
-
-    private String _generateValidatorDoc(VelocityEngine velocityEngine, 
-            VelocityContext baseContext, ValidatorMeta validator)
-            throws Exception
-    {
-        if (validator.getName() == null)
-        {
-            return null;
-        }
-
-        String pageName = _toPageName(validator.getName());
-        
-        Context context = new VelocityContext(baseContext);
-        context.put("validator", validator);
-        
-        String baseContent = "";
-        
-        File xmlBaseFile = new File(baseFilesSourceDirectory, 
-                _platformAgnosticPath(pageName + "-base.xml"));
-        
-        if (xmlBaseFile != null && xmlBaseFile.exists())
-        {
-            if (getLog().isDebugEnabled())
-            {
-                getLog().debug("using base content file: "+xmlBaseFile.getPath());
-            }
-            
-            Reader reader = null;
-            try
-            {
-                reader = new FileReader(xmlBaseFile);
-                Xpp3Dom root = Xpp3DomBuilder.build(reader);
-                
-                StringWriter writer = new StringWriter();
-                
-                Xpp3Dom [] children = root.getChild("body").getChildren();
-                
-                for (int i = 0; i< children.length; i++)
-                {
-                    Xpp3Dom dom = children[i];
-                    Xpp3DomWriter.write(writer, dom);
-                }
-                baseContent = writer.toString();
-                writer.close();
-            }
-            catch (XmlPullParserException e)
-            {
-                throw new MojoExecutionException(
-                        "Error parsing base file: " + e.getMessage(), e);
-            }
-            finally
-            {
-                reader.close();
-            }
-        }
-        
-        baseContext.put("baseContent", baseContent);        
-        
-        Writer out = null;
-        
-        try
-        {        
-            File targetDir = new File(outputDirectory.getParentFile(),
-                    _platformAgnosticPath("generated-site/xdoc/"
-                            + _DOC_SUBDIRECTORY));
-            
-            if ( !targetDir.exists() )
-            {
-                targetDir.mkdirs();
-            }
-            File targetFile = new File(targetDir, pageName + ".xml");
-    
-            out = new OutputStreamWriter(new FileOutputStream(targetFile),
-                    "UTF-8");
-            
-            Template template = velocityEngine.getTemplate(getTemplateValidator());
-            
-            template.merge(context, out);
-            
-            out.flush();
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException(
-                    "Error merging velocity templates: " + e.getMessage(), e);
-        }
-        finally
-        {
-            IOUtil.close(out);
-            out = null;
-        }
-
-        return pageName;
-    }
-    
-    private String _generateTagDoc(VelocityEngine velocityEngine, 
-            VelocityContext baseContext, TagMeta tag)
-            throws Exception
-    {
-        if (tag.getName() == null)
-        {
-            return null;
-        }
-
-        String pageName = _toPageName(tag.getName());
-        
-        Context context = new VelocityContext(baseContext);
-        context.put("tag", tag);
-        
-        String baseContent = "";
-        
-        File xmlBaseFile = new File(baseFilesSourceDirectory, 
-                _platformAgnosticPath(pageName + "-base.xml"));
-        
-        if (xmlBaseFile != null && xmlBaseFile.exists())
-        {
-            if (getLog().isDebugEnabled())
-            {
-                getLog().debug("using base content file: "+xmlBaseFile.getPath());
-            }
-            
-            Reader reader = null;
-            try
-            {
-                reader = new FileReader(xmlBaseFile);
-                Xpp3Dom root = Xpp3DomBuilder.build(reader);
-                
-                StringWriter writer = new StringWriter();
-                
-                Xpp3Dom [] children = root.getChild("body").getChildren();
-                
-                for (int i = 0; i< children.length; i++)
-                {
-                    Xpp3Dom dom = children[i];
-                    Xpp3DomWriter.write(writer, dom);
-                }
-                baseContent = writer.toString();
-                writer.close();
-            }
-            catch (XmlPullParserException e)
-            {
-                throw new MojoExecutionException(
-                        "Error parsing base file: " + e.getMessage(), e);
-            }
-            finally
-            {
-                reader.close();
-            }
-        }
-        
-        baseContext.put("baseContent", baseContent);        
-        
-        Writer out = null;
-        
-        try
-        {        
-            File targetDir = new File(outputDirectory.getParentFile(),
-                    _platformAgnosticPath("generated-site/xdoc/"
-                            + _DOC_SUBDIRECTORY));
-            
-            if ( !targetDir.exists() )
-            {
-                targetDir.mkdirs();
-            }
-            File targetFile = new File(targetDir, pageName + ".xml");
-    
-            out = new OutputStreamWriter(new FileOutputStream(targetFile),
-                    "UTF-8");
-            
-            Template template = velocityEngine.getTemplate(getTemplateTag());
-            
-            template.merge(context, out);
-            
-            out.flush();
-        }
-        catch (Exception e)
-        {
-            throw new MojoExecutionException(
-                    "Error merging velocity templates: " + e.getMessage(), e);
-        }
-        finally
-        {
-            IOUtil.close(out);
-            out = null;
-        }
-
-        return pageName;
-    }
-    
-
-    static private final String _platformAgnosticPath(String path)
-    {
-        return path.replace('/', File.separatorChar);
-    }
-
-    protected MavenProject getProject()
-    {
-        return project;
-    }
-
-    protected String getOutputDirectory()
-    {
-        return outputDirectory.getAbsolutePath();
-    }
-
-    public String getName(Locale locale)
-    {
-        return "JSF Tag Documentation";
-    }
-
-    public String getDescription(Locale locale)
-    {
-        return "Documentation for JSF Tags";
-    }
-
-    public String getOutputName()
-    {
-        return "tagdoc";
-    }
-
-    protected Model getModel()
-    {
-        return _model;
-    }
-
-    protected List getMasterConfigs(MavenProject project)
-            throws MavenReportException
-    {
-        String resourcePath = "META-INF/maven-faces-plugin/faces-config.xml";
-        return getCompileDependencyResources(project, resourcePath);
-    }
-
-    protected List getCompileDependencyResources(MavenProject project,
-            String resourcePath) throws MavenReportException
-    {
-        try
-        {
-            ClassLoader cl = createCompileClassLoader(project);
-            Enumeration e = cl.getResources(resourcePath);
-            List urls = new ArrayList();
-            while (e.hasMoreElements())
-            {
-                URL url = (URL) e.nextElement();
-                urls.add(url);
-            }
-            return Collections.unmodifiableList(urls);
-        }
-        catch (IOException e)
-        {
-            throw new MavenReportException("Unable to get resources for path "
-                    + "\"" + resourcePath + "\"", e);
-        }
-
-    }
-
-    private ClassLoader createCompileClassLoader(MavenProject project)
-            throws MavenReportException
-    {
-        Thread current = Thread.currentThread();
-        ClassLoader cl = current.getContextClassLoader();
-
-        try
-        {
-            List classpathElements = project.getCompileClasspathElements();
-            if (!classpathElements.isEmpty())
-            {
-                String[] entries = (String[]) classpathElements
-                        .toArray(new String[0]);
-                URL[] urls = new URL[entries.length];
-                for (int i = 0; i < urls.length; i++)
-                {
-                    urls[i] = new File(entries[i]).toURL();
-                }
-                cl = new URLClassLoader(urls, cl);
-            }
-        }
-        catch (DependencyResolutionRequiredException e)
-        {
-            throw new MavenReportException("Error calculating scope classpath",
-                    e);
-        }
-        catch (MalformedURLException e)
-        {
-            throw new MavenReportException("Error calculating scope classpath",
-                    e);
-        }
-
-        return cl;
-    }
-
-    static public class URLCreationFactory extends
-            AbstractObjectCreationFactory
-    {
-        public Object createObject(Attributes attributes)
-                throws MalformedURLException
-        {
-            String href = attributes.getValue("href");
-            if (href == null)
-            {
-                throw new IllegalStateException("Missing href attribute");
-            }
-
-            URL master = (URL) digester.getRoot();
-            return new URL(master, href);
-        }
-    }
-
-    public String getTemplateComponent()
-    {
-        return templateComponent;
-    }
-
-    public String getTemplateConverter()
-    {
-        return templateConverter;
-    }
-
-    public String getTemplateValidator()
-    {
-        return templateValidator;
-    }
-
-    public String getTemplateTag()
-    {
-        return templateTag;
-    }
-    
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/tagdoc/TagdocIndexReport.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/tagdoc/TagdocIndexReport.java
deleted file mode 100644
index e8f0d77..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/tagdoc/TagdocIndexReport.java
+++ /dev/null
@@ -1,478 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.tagdoc;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.logging.Logger;
-
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.reporting.AbstractMavenReport;
-import org.apache.maven.reporting.MavenReportException;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.Flattener;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.IOUtils;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ClassMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ComponentMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ConverterMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.TagMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ValidatorMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.utils.MyfacesUtils;
-import org.apache.velocity.runtime.resource.ResourceManagerImpl;
-import org.codehaus.doxia.sink.Sink;
-import org.codehaus.doxia.site.renderer.SiteRenderer;
-
-/**
- * Report for generating JSF tagdoc index based on myfaces-metadata.xml parsing.
- * The content is generated using velocity in xdoc files (see TagdocContentMojo).
- *
- * @author Leonardo Uribe
- * @goal tagdoc-index
- */
-public class TagdocIndexReport extends AbstractMavenReport
-{
-    final Logger log = Logger.getLogger(TagdocIndexReport.class.getName());
-
-    private Model _model;
-
-    /**
-     * Specifies the directory where the report will be generated
-     *
-     * @parameter default-value="${project.reporting.outputDirectory}"
-     * @required
-     */
-    private File outputDirectory;
-
-    /**
-     * Directory where the original site is present.
-     * (TRIED using ${baseDir}/src/site;  that inserted a 'null' into
-     * the string for some reason.  TRIED using ${siteDirectory},
-     * which was undefined.  TRIED ${project.directory}src/site; which also
-     * inserted a null.  ${project.build.directory}/../src/site seems to work,
-     * though it assumes that ${project.build.directory} is 
-     * ${project.directory}/target.
-     * 
-     * @parameter default-value="${project.build.directory}/../src/site/"
-     * @required
-     */
-    private File siteDirectory;
-
-    /**
-     * @parameter expression="${project}"
-     * @required
-     * @readonly
-     */
-    private MavenProject project;
-
-    /**
-     * @component
-     * @required
-     * @readonly
-     */
-    private SiteRenderer siteRenderer;
-
-    /**
-     * @parameter
-     */
-    private Map taglibs;
-
-    /**
-     * @parameter expression="${project.build.directory}/myfaces-builder-plugin/main/resources"
-     * @readonly
-     */
-    private File buildDirectory;
-
-    /**
-     * Injected name of file generated by earlier run of BuildMetaDataMojo goal.
-     * 
-     * @parameter
-     */
-    private String metadataFile = "META-INF/myfaces-metadata.xml";
-
-    /**
-     * @parameter
-     */
-    private List modelIds;
-
-    /**
-     * component role="org.codehaus.plexus.velocity.VelocityComponent" roleHint="tagdoc"
-     */
-    //private VelocityComponent velocityComponent;
-    static private final String _DOC_SUBDIRECTORY = "tagdoc";
-
-    protected void executeReport(Locale locale) throws MavenReportException
-    {
-
-        if (modelIds == null)
-        {
-            modelIds = new ArrayList();
-            modelIds.add(project.getArtifactId());
-        }
-
-        if (taglibs == null)
-        {
-            taglibs = new HashMap();
-            taglibs.put("t", "http://myfaces.apache.org/tomahawk");
-        }
-
-        try
-        {
-            _model = IOUtils.loadModel(new File(buildDirectory, metadataFile));
-            new Flattener(_model).flatten();
-            _generateTagDocs();
-        }
-        catch (Exception e)
-        {
-            throw new MavenReportException("Couldn't generate tagdoc", e);
-        }
-    }
-
-    public boolean canGenerate(ClassMeta component)
-    {
-        if (modelIds.contains(component.getModelId()))
-        {
-            return true;
-        }
-        else
-        {
-            return false;
-        }
-    }
-
-    public class CustomResourceManagerImpl extends ResourceManagerImpl
-    {
-
-        public CustomResourceManagerImpl()
-        {
-            super();
-        }
-
-    }
-
-    private void _generateTagDocs() throws Exception
-    {
-        Model model = getModel();
-        if (model.getComponents().size() == 0)
-        {
-            getLog().info("Nothing to generate - no components found");
-            return;
-        }
-
-        Iterator components = model.components();
-
-        Iterator validators = model.validators();
-
-        Iterator converters = model.converters();
-        
-        Iterator tags = model.tags();
-
-        // =-=AEW Note that only updating out-of-date components, etc. is
-        // permanently tricky, even if we had proper detection in place,
-        // because the index always has to have all docs
-        /*
-        if (!components.hasNext() && !converters.hasNext() && !validators.hasNext())
-        {
-          getLog().info("Nothing to generate - all docs are up to date");
-          return;
-        }
-        */
-
-        Set componentPages = new TreeSet();
-        Set converterPages = new TreeSet();
-        Set validatorPages = new TreeSet();
-        Set tagsPages = new TreeSet();
-
-        int count = 0;
-        while (components.hasNext())
-        {
-            ComponentMeta component = (ComponentMeta) components.next();
-            if (canGenerate(component))
-            {
-                String pageName = _generateComponentDoc(component);
-                if (pageName != null)
-                {
-                    componentPages.add(pageName);
-                    count++;
-                }
-            }
-        }
-        while (converters.hasNext())
-        {
-            ConverterMeta converter = (ConverterMeta) converters.next();
-            if (canGenerate(converter))
-            {
-                String pageName = _generateConverterDoc(converter);
-                if (pageName != null)
-                {
-                    converterPages.add(pageName);
-                    count++;
-                }
-            }
-        }
-        while (validators.hasNext())
-        {
-            ValidatorMeta validator = (ValidatorMeta) validators.next();
-
-            if (canGenerate(validator))
-            {
-                String pageName = _generateValidatorDoc(validator);
-                if (pageName != null)
-                {
-                    validatorPages.add(pageName);
-                    count++;
-                }
-            }
-        }
-        while (tags.hasNext())
-        {
-            TagMeta tag = (TagMeta) tags.next();
-            
-            if (canGenerate(tag))
-            {
-                String pageName = _generateTagDoc(tag);
-                if (pageName != null)
-                {
-                    tagsPages.add(pageName);
-                    count++;
-                }                
-            }
-        }
-
-        Set otherPages = _gatherOtherTags();
-
-        getLog().info("Generated " + count + " page(s)");
-
-        Sink sink = getSink();
-        sink.head();
-        sink.title();
-        sink.text("Tag library documentation");
-        sink.title_();
-        sink.head_();
-        sink.body();
-
-        sink.sectionTitle1();
-        sink.text("Tag library information");
-        sink.sectionTitle1_();
-        sink.section1();
-
-        for (Iterator i = taglibs.entrySet().iterator(); i.hasNext();)
-        {
-            Map.Entry entry = (Map.Entry) i.next();
-            sink.paragraph();
-
-            sink.bold();
-            sink.text("Short name:");
-            sink.bold_();
-            sink.nonBreakingSpace();
-            sink.text(entry.getKey().toString());
-            sink.lineBreak();
-
-            sink.bold();
-            sink.text("Namespace:");
-            sink.bold_();
-            sink.nonBreakingSpace();
-            sink.text(entry.getValue().toString());
-            sink.lineBreak();
-
-            sink.paragraph_();
-        }
-
-        sink.section1_();
-
-        _writeIndexSection(sink, componentPages, "Components");
-        _writeIndexSection(sink, converterPages, "Converters");
-        _writeIndexSection(sink, validatorPages, "Validators");
-        _writeIndexSection(sink, tagsPages, "JSF Tags");
-        _writeIndexSection(sink, otherPages, "Miscellaneous");
-
-        sink.body_();
-    }
-
-    private Set _gatherOtherTags()
-    {
-        TreeSet set = new TreeSet();
-        String subDir = _platformAgnosticPath(_platformAgnosticPath("xdoc/"
-                + _DOC_SUBDIRECTORY));
-        File siteSubDir = new File(siteDirectory, subDir);
-        if (siteSubDir.exists())
-        {
-            String[] files = siteSubDir.list();
-            for (int i = 0; i < files.length; i++)
-            {
-                String file = files[i];
-                if (file.endsWith(".xml"))
-                {
-                    set.add(file.substring(0, file.length() - 4));
-                }
-            }
-        }
-
-        return set;
-    }
-
-    private void _writeIndexSection(Sink sink, Set pages, String title)
-    {
-        if (pages.isEmpty())
-        {
-            return;
-        }
-
-        sink.sectionTitle1();
-        sink.text(title);
-        sink.sectionTitle1_();
-        sink.section1();
-        sink.table();
-        sink.tableRow();
-        sink.tableHeaderCell();
-        sink.text("Tag Name");
-        sink.tableHeaderCell_();
-        sink.tableRow_();
-
-        Iterator iter = pages.iterator();
-        while (iter.hasNext())
-        {
-            sink.tableRow();
-            sink.tableCell();
-
-            String name = (String) iter.next();
-            String tagName = "<" + name.replace('_', ':') + ">";
-
-            sink.link(_DOC_SUBDIRECTORY + "/" + name + ".html");
-            sink.text(tagName);
-            sink.link_();
-
-            sink.tableCell_();
-            sink.tableRow_();
-        }
-
-        sink.table_();
-        sink.section1_();
-    }
-
-    public boolean usePageLinkBar()
-    {
-        return false;
-    }
-
-    private String _toPageName(String qName)
-    {
-        return MyfacesUtils.getTagPrefix(qName) + "_"
-                + MyfacesUtils.getTagName(qName);
-    }
-
-    private String _generateComponentDoc(ComponentMeta component)
-            throws Exception
-    {
-        if (component.getName() == null)
-        {
-            return null;
-        }
-        String pageName = _toPageName(component.getName());
-
-        return pageName;
-    }
-
-    private String _generateConverterDoc(ConverterMeta converter)
-            throws IOException
-    {
-        if (converter.getName() == null)
-        {
-            return null;
-        }
-
-        String pageName = _toPageName(converter.getName());
-
-        return pageName;
-    }
-
-    private String _generateValidatorDoc(ValidatorMeta validator)
-            throws IOException
-    {
-        if (validator.getName() == null)
-        {
-            return null;
-        }
-
-        String pageName = _toPageName(validator.getName());
-
-        return pageName;
-    }
-    
-    private String _generateTagDoc(TagMeta tag)
-        throws IOException
-    {
-        if (tag.getName() == null)
-        {
-            return null;
-        }
-        
-        String pageName = _toPageName(tag.getName());
-        
-        return pageName;
-    }    
-
-    static private final String _platformAgnosticPath(String path)
-    {
-        return path.replace('/', File.separatorChar);
-    }
-
-    protected MavenProject getProject()
-    {
-        return project;
-    }
-
-    protected String getOutputDirectory()
-    {
-        return outputDirectory.getAbsolutePath();
-    }
-
-    protected SiteRenderer getSiteRenderer()
-    {
-        return siteRenderer;
-    }
-
-    public String getName(Locale locale)
-    {
-        return "JSF Tag Documentation";
-    }
-
-    public String getDescription(Locale locale)
-    {
-        return "Documentation for JSF Tags";
-    }
-
-    public String getOutputName()
-    {
-        return "tagdoc";
-    }
-
-    protected Model getModel()
-    {
-        return _model;
-    }
-
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/tagdoc/TagdocUtils.java b/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/tagdoc/TagdocUtils.java
deleted file mode 100644
index 84b4bf3..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/tagdoc/TagdocUtils.java
+++ /dev/null
@@ -1,162 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.tagdoc;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.TreeSet;
-
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.AttributeHolder;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.AttributeMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ComponentMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.FacetHolder;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.FacetMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.PropertyHolder;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.PropertyMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.RenderKitMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.RendererMeta;
-
-public class TagdocUtils
-{
-    
-    static public final String platformAgnosticPath(String path)
-    {
-        return path.replace('/', File.separatorChar);
-    }
-    
-    static public String getDisplayType(String className, String name,
-            String type)
-    {
-        if (type.startsWith("java.lang."))
-        {
-            return type.substring("java.lang.".length());
-        }
-        else if ("binding".equals(name))
-        {
-            StringTokenizer tokens = new StringTokenizer(className, ".", true);
-            String out = "";
-            while (tokens.hasMoreTokens())
-            {
-                String token = tokens.nextToken();
-                out = out + token;
-                // Give ourselves an opportunity for a line break after "component.";
-                if (out.endsWith("component."))
-                {
-                    out = out + "<wbr/>";
-                }
-            }
-
-            return out;
-        }
-
-        return type;
-    }
-    
-    static public List getSortedPropertyList(PropertyHolder component)
-    {
-        // Sort the names
-        TreeSet attributes = new TreeSet();
-        Iterator attrs = component.properties();
-        while (attrs.hasNext())
-        {
-            PropertyMeta property = (PropertyMeta) attrs.next();
-            if (!property.isTagExcluded().booleanValue())
-            {
-                attributes.add(property.getName());
-            }
-        }
-
-        // Now get a list of PropertyMetas
-        List list = new ArrayList();
-        Iterator iter = attributes.iterator();
-        while (iter.hasNext())
-        {
-            String attrName = (String) iter.next();
-            list.add(component.getProperty(attrName));
-        }
-        return list;        
-    }
-    
-    static public List getSortedFacetList(FacetHolder component)
-    {
-        TreeSet facetNames = new TreeSet();
-        Iterator iter = component.facets();
-        while (iter.hasNext())
-        {
-            facetNames.add(((FacetMeta) iter.next()).getName());
-        }
-        
-        // Now get a list of PropertyMetas
-        List list = new ArrayList();
-        Iterator nameIter = facetNames.iterator();
-        while (nameIter.hasNext())
-        {
-            String name = (String) nameIter.next();
-            list.add(component.getFacet(name));
-        }
-        return list;
-    }
-    
-    static public List getSortedAttributeList(AttributeHolder component)
-    {
-        // Sort the names
-        TreeSet attributes = new TreeSet();
-        Iterator attrs = component.attributes();
-        while (attrs.hasNext())
-        {
-            AttributeMeta attribute = (AttributeMeta) attrs.next();
-            attributes.add(attribute.getName());
-        }
-
-        // Now get a list of PropertyMetas
-        List list = new ArrayList();
-        Iterator iter = attributes.iterator();
-        while (iter.hasNext())
-        {
-            String attrName = (String) iter.next();
-            list.add(component.getAttribute(attrName));
-        }
-        return list;        
-    }
-        
-    static public Map getRendererClasses(ComponentMeta component, Model model)
-    {
-        Map componentRenderers = new HashMap(); 
-        List renderKits = model.getRenderKits();
-        if (renderKits != null)
-        {
-            for (Iterator it = renderKits.iterator();it.hasNext();)
-            {
-                RenderKitMeta renderkit = (RenderKitMeta) it.next();
-                RendererMeta renderer = renderkit.findRenderer(component.getFamily(), component.getRendererType());
-                if (renderer != null)
-                {
-                    componentRenderers.put(renderkit.getRenderKitId(), renderer.getClassName());
-                }
-            }
-        }
-        return componentRenderers;
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/componentClass11.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/componentClass11.vm
deleted file mode 100644
index dde95ba..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/componentClass11.vm
+++ /dev/null
@@ -1,265 +0,0 @@
-## Velocity template used to generate JSF1.1-compatible component classes
-## from component meta-data.
-##
-## Note that there are two types of component generation:
-##  * "subclass mode" (use annotated class as a parent class)
-##  * "template mode" (use annotated class as a template)
-## This template file is used for both.
-##
-## Variable $component refers to a ComponentMeta object to process
-## Variable $utils refers to an instance of MyfacesUtils.
-##
-## When "template mode" is being used then variable $innersource
-## holds a String containing all the non-abstract functions defined
-## in the annotated class.
-##
-## The java package of the generated class is always the same as
-## the package in which the annotated class exists.
-##
-## This file is not actually used (except for unit testing). Each
-## project that uses the myfaces-builder-plugin is expected to copy
-## this file into its own META-INF dir, from where the builder
-## plugin will retrieve it.
-##
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- * 
- *  http://www.apache.org/licenses/LICENSE-2.0
- * 
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package ${component.packageName};
-
-import javax.faces.component.UIComponent;
-import javax.faces.el.ValueBinding;
-import javax.faces.context.FacesContext;
-import $component.parentClassName;
-$utils.importTagClasses($component)
-
-#if ($component.isTemplate())
-#set ($generatedClassParent = $component.sourceClassParentClassName)
-#else
-#set ($generatedClassParent = $component.sourceClassName)
-#end
-// Generated from class ${component.sourceClassName}.
-//
-// WARNING: This file was automatically generated. Do not edit it directly,
-//          or you will lose your changes.
-public class ${utils.getClassFromFullClass($component.className)} extends $generatedClassParent
-#if ($component.implements)
-    implements $component.implements
-#end
-{
-#if ($component.serialuid)
-    private static final long serialVersionUID = ${component.serialuid}; 
-#end  
-
-##    static public final String COMPONENT_FAMILY =
-##        "$component.family";
-    static public final String COMPONENT_TYPE =
-        "$component.type";
-
-#if ($innersource)
-    //BEGIN CODE COPIED FROM $component.sourceClassName 
-$innersource
-    //END CODE COPIED FROM $component.sourceClassName
-#end
-
-    public ${utils.getClassFromFullClass($component.className)}()
-    {
-#if ($component.rendererType)
-#if ($component.rendererType == "")
-        setRendererType(null);
-#else
-        setRendererType("$component.rendererType");
-#end
-#else
-        setRendererType(null);
-#end
-    }
-
-## On myfaces 1.1 the family is inherited, so this could be commented    
-##    public String getFamily()
-##    {
-##        return COMPONENT_FAMILY;
-##    }
-    
-#set ($propertyList = ${component.propertyComponentList})
-
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($type = $utils.getClassFromFullClass($property.className))
-#if($utils.getDefaultValueField($property)) 
-#set ($defaultValue = $utils.getDefaultValueField($property))
-#else
-#set ($defaultValue = false)
-#end
-    // Property: $property.name
-#if ($property.isLiteralOnly() || $property.isTagExcluded() )
-    private $type $field #if($defaultValue) = $defaultValue;#{else};#{end}
-
-     
-#else
-    private $type $field;
-    
-#end
-#if($utils.isPrimitiveClass($type) && !$property.isTagExcluded()
-    && !$property.isLiteralOnly() )
-    private boolean ${field}Set;
-    
-#if ($property.isSetMethod())
-    $property.setMethodScope boolean $utils.getPrefixedPropertyName("isSet", $property.name)()
-    {
-        return ${field}Set;
-    }
-#end
-#end
-#if($property.isLocalMethod())
-#if("boolean" == $type)
-#set ($methodName = $utils.getPrefixedPropertyName("isLocal", $property.name))
-#else
-#set ($methodName = $utils.getPrefixedPropertyName("getLocal", $property.name))
-#end
-    final $property.localMethodScope $type ${methodName}()
-    {
-        return $field;
-    }
-     
-#end
-    public $type $utils.getMethodReaderFromProperty($property.name, $type)()
-    {
-#if ($property.isTagExcluded() || $property.isLiteralOnly())
-        return $field;
-#else
-#if ($utils.isPrimitiveClass($type))
-        if (${field}Set)
-#else
-        if ($field != null)
-#end
-        {
-            return $field;
-        }
-        ValueBinding vb = getValueBinding("$property.name");
-        if (vb != null)
-        {
-#if ($utils.isPrimitiveClass($type))
-            return ($utils.castIfNecessary($type) vb.getValue(getFacesContext())).${type}Value();
-#else
-#set ($pritype = $utils.getPrimitiveType($property.className))
-#if ($utils.isPrimitiveClass($pritype))
-            Object value = vb == null ? null : vb.getValue(getFacesContext());
-            if (!(value instanceof $type)){
-                value = ${type}.valueOf(value.toString());
-            }            
-            return $utils.castIfNecessary($type) value;
-#elseif ($type == "String")
-## MYFACES-2006 use toString(), so Numeric ValueBinding could be converted as
-## Strings and do not cause ClassCastException 
-## (only applies for JSF 1.1 due to backward compatibility) 
-            return $utils.castIfNecessary($type) vb.getValue(getFacesContext()).toString();
-#else
-            return $utils.castIfNecessary($type) vb.getValue(getFacesContext());
-#end
-#end
-        }
-#if ($defaultValue)
-        return $defaultValue; 
-#elseif ($utils.isPrimitiveClass($type))
-        return $utils.primitiveDefaultValue($type);
-#else       
-        return null;
-#end
-#end
-    }
-
-    public void $utils.getPrefixedPropertyName("set", $property.name)($type $utils.getVariableFromName($property.name))
-    {
-        this.$field = $utils.getVariableFromName($property.name);
-#if ($utils.isPrimitiveClass($type) && !$property.isTagExcluded() 
-     && !$property.isLiteralOnly())
-        this.${field}Set = true;        
-#end
-    }
-#end
-
-    public Object saveState(FacesContext facesContext)
-    {
-#set ($primitiveCount = $propertyList.size() + 1)
-#foreach( $property in $propertyList )
-#if($utils.isPrimitiveClass($property.className) && 
-    !$property.isLiteralOnly())
-#set ($primitiveCount = $primitiveCount + 1)
-#end
-#end
-        Object[] values = new Object[$primitiveCount];
-        values[0] = super.saveState(facesContext);
-#set ($arrayIndex = 0)
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($type = $property.className)
-#set ($arrayIndex = $arrayIndex + 1)
-#if ($property.jspName == "validator" && $property.isMethodBinding() )
-        values[$arrayIndex] = saveAttachedState(facesContext,${field}List);
-#elseif ( $property.isStateHolder() )## || $utils.isConverter($type)
-        values[$arrayIndex] = saveAttachedState(facesContext,$field);
-#elseif($utils.isPrimitiveClass($type))
-#if ($type == "boolean")
-        values[$arrayIndex] = ${utils.getBoxedClass($type)}.valueOf($field);
-#else
-        values[$arrayIndex] = new ${utils.getBoxedClass($type)}($field);
-#end
-#else
-        values[$arrayIndex] = $field;
-#end
-#if($utils.isPrimitiveClass($type) && !$property.isTagExcluded()
-    && !$property.isLiteralOnly() )
-#set ($arrayIndex = $arrayIndex + 1)
-        values[$arrayIndex] = Boolean.valueOf(${field}Set);
-#end
-#end
-        return values; 
-    }
-
-    public void restoreState(FacesContext facesContext, Object state)
-    {
-        Object[] values = (Object[])state;
-        super.restoreState(facesContext,values[0]);
-#set ($arrayIndex = 0)
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($type = $property.className)
-#set ($arrayIndex = $arrayIndex + 1)
-#if ( $property.isStateHolder() )
-#if ($property.jspName == "validator" && $property.isMethodBinding() )
-        ${field}List = (List<Validator>) restoreAttachedState(facesContext,values[$arrayIndex]);
-#elseif ($utils.isList($type))
-        $field = (List) restoreAttachedState(facesContext,values[$arrayIndex]);
-#else
-        $field = $utils.castIfNecessary($type) restoreAttachedState(facesContext,values[$arrayIndex]); 
-#end
-#elseif ($utils.isConverter($type)) 
-        $field = (Converter) restoreAttachedState(facesContext,values[$arrayIndex]);
-#elseif ($utils.isPrimitiveClass($type))
-        $field = ($utils.castIfNecessary($type) values[$arrayIndex]).${type}Value();
-#else
-        $field = $utils.castIfNecessary($type) values[$arrayIndex];
-#end
-#if($utils.isPrimitiveClass($type) && !$property.isTagExcluded()
-    && !$property.isLiteralOnly() )
-#set ($arrayIndex = $arrayIndex + 1)
-        ${field}Set = ((Boolean) values[$arrayIndex]).booleanValue();
-#end
-#end
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/componentClass12.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/componentClass12.vm
deleted file mode 100644
index 2580c9e..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/componentClass12.vm
+++ /dev/null
@@ -1,256 +0,0 @@
-## Velocity template used to generate JSF1.2-compatible component classes
-## from component meta-data.
-##
-## Note that there are two types of component generation:
-##  * "subclass mode" (use annotated class as a parent class)
-##  * "template mode" (use annotated class as a template)
-## This template file is used for both.
-##
-## Variable $component refers to a ComponentMeta object to process
-## Variable $utils refers to an instance of MyfacesUtils.
-##
-## When "template mode" is being used then variable $innersource
-## holds a String containing all the non-abstract functions defined
-## in the annotated class.
-##
-## The java package of the generated class is always the same as
-## the package in which the annotated class exists.
-##
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- * 
- *  http://www.apache.org/licenses/LICENSE-2.0
- * 
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package ${component.packageName};
-
-import javax.el.ValueExpression;
-import javax.faces.context.FacesContext;
-$utils.importTagClasses($component)
-
-#if ($component.isTemplate())
-#set ($generatedClassParent = $component.sourceClassParentClassName)
-#else
-#set ($generatedClassParent = $component.sourceClassName)
-#end
-// Generated from class ${component.sourceClassName}.
-//
-// WARNING: This file was automatically generated. Do not edit it directly,
-//          or you will lose your changes.
-public class ${utils.getClassFromFullClass($component.className)} extends $generatedClassParent
-#if ($component.implements)
-    implements $component.implements
-#end
-{
-#if ($component.serialuid)
-    private static final long serialVersionUID = ${component.serialuid}; 
-#end  
-
-    static public final String COMPONENT_FAMILY =
-        "$component.family";
-    static public final String COMPONENT_TYPE =
-        "$component.type";
-#if ($component.rendererType)
-#if (!($component.rendererType == ""))
-    static public final String DEFAULT_RENDERER_TYPE = 
-        "$component.rendererType";
-#end
-#end
-
-#if ($innersource)
-    //BEGIN CODE COPIED FROM $component.sourceClassName 
-$innersource
-    //END CODE COPIED FROM $component.sourceClassName
-#end
-
-    public ${utils.getClassFromFullClass($component.className)}()
-    {
-#if ($component.rendererType)
-#if ($component.rendererType == "")
-        setRendererType(null);
-#else
-        setRendererType("$component.rendererType");
-#end
-#else
-        setRendererType(null);
-#end
-    }
-
-## On myfaces 1.1 the family is inherited, so this could be commented
-## On other this should not be commented    
-    public String getFamily()
-    {
-        return COMPONENT_FAMILY;
-    }
-    
-#set ($propertyList = ${component.propertyComponentList})
-
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($type = $utils.getClassFromFullClass($property.className))
-#if($utils.getDefaultValueField($property)) 
-#set ($defaultValue = $utils.getDefaultValueField($property))
-#else
-#set ($defaultValue = false)
-#end
-    // Property: $property.name
-#if ($property.isLiteralOnly() || $property.isTagExcluded() )
-    private $type $field #if($defaultValue) = $defaultValue;#{else};#{end}
-
-     
-#else
-    private $type $field;
-    
-#end
-#if($utils.isPrimitiveClass($type) && !$property.isTagExcluded()
-    && !$property.isLiteralOnly() )
-    private boolean ${field}Set;
-    
-#if ($property.isSetMethod())
-    $property.setMethodScope boolean $utils.getPrefixedPropertyName("isSet", $property.name)()
-    {
-        return ${field}Set;
-    }
-#end
-#end
-#if($property.isLocalMethod())
-#if("boolean" == $type)
-#set ($methodName = $utils.getPrefixedPropertyName("isLocal", $property.name))
-#else
-#set ($methodName = $utils.getPrefixedPropertyName("getLocal", $property.name))
-#end
-    final $property.localMethodScope $type ${methodName}()
-    {
-        return $field;
-    }
-     
-#end
-    public $type $utils.getMethodReaderFromProperty($property.name, $type)()
-    {
-#if ($property.isTagExcluded() || $property.isLiteralOnly())
-        return $field;
-#else
-#if ($utils.isPrimitiveClass($type))
-        if (${field}Set)
-#else
-        if ($field != null)
-#end
-        {
-            return $field;
-        }
-        ValueExpression vb = getValueExpression("$property.name");
-        if (vb != null)
-        {
-#if ($utils.isPrimitiveClass($type))
-            return ($utils.castIfNecessary($type) vb.getValue(getFacesContext().getELContext())).${type}Value();
-#else
-#set ($pritype = $utils.getPrimitiveType($property.className))
-#if ($utils.isPrimitiveClass($pritype))
-            Object value = vb == null ? null : vb.getValue(getFacesContext().getELContext());
-            if (!(value instanceof $type)){
-                value = ${type}.valueOf(value.toString());
-            }            
-            return $utils.castIfNecessary($type) value;
-#else
-            return $utils.castIfNecessary($type) vb.getValue(getFacesContext().getELContext());
-#end
-#end
-        }
-#if ($defaultValue)
-        return $defaultValue; 
-#elseif ($utils.isPrimitiveClass($type))
-        return $utils.primitiveDefaultValue($type);
-#else       
-        return null;
-#end
-#end
-    }
-
-    public void $utils.getPrefixedPropertyName("set", $property.name)($type $utils.getVariableFromName($property.name))
-    {
-        this.$field = $utils.getVariableFromName($property.name);
-#if ($utils.isPrimitiveClass($type) && !$property.isTagExcluded() 
-     && !$property.isLiteralOnly())
-        this.${field}Set = true;        
-#end
-    }
-#end
-
-    public Object saveState(FacesContext facesContext)
-    {
-#set ($primitiveCount = $propertyList.size() + 1)
-#foreach( $property in $propertyList )
-#if($utils.isPrimitiveClass($property.className) && 
-    !$property.isLiteralOnly())
-#set ($primitiveCount = $primitiveCount + 1)
-#end
-#end
-        Object[] values = new Object[$primitiveCount];
-        values[0] = super.saveState(facesContext);
-#set ($arrayIndex = 0)
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($type = $property.className)
-#set ($arrayIndex = $arrayIndex + 1)
-#if ($property.jspName == "validator" && $property.isMethodBinding() )
-        values[$arrayIndex] = saveAttachedState(facesContext,${field}List);
-#elseif ( $property.isStateHolder() )## || $utils.isConverter($type)
-        values[$arrayIndex] = saveAttachedState(facesContext,$field);
-#elseif($utils.isPrimitiveClass($type))
-        values[$arrayIndex] = ${utils.getBoxedClass($type)}.valueOf($field);
-#else
-        values[$arrayIndex] = $field;
-#end
-#if($utils.isPrimitiveClass($type) && !$property.isTagExcluded()
-    && !$property.isLiteralOnly() )
-#set ($arrayIndex = $arrayIndex + 1)
-        values[$arrayIndex] = Boolean.valueOf(${field}Set);
-#end
-#end
-        return values; 
-    }
-
-    public void restoreState(FacesContext facesContext, Object state)
-    {
-        Object[] values = (Object[])state;
-        super.restoreState(facesContext,values[0]);
-#set ($arrayIndex = 0)
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($type = $property.className)
-#set ($arrayIndex = $arrayIndex + 1)
-#if ( $property.isStateHolder() )
-#if ($property.jspName == "validator" && $property.isMethodBinding() )
-        ${field}List = (List<Validator>) restoreAttachedState(facesContext,values[$arrayIndex]);
-#elseif ($utils.isList($type))
-        $field = (List) restoreAttachedState(facesContext,values[$arrayIndex]);
-#else
-        $field = $utils.castIfNecessary($type) restoreAttachedState(facesContext,values[$arrayIndex]); 
-#end
-#elseif ($utils.isConverter($type)) 
-        $field = (Converter) restoreAttachedState(facesContext,values[$arrayIndex]);
-#elseif ($utils.isPrimitiveClass($type))
-        $field = ($utils.castIfNecessary($type) values[$arrayIndex]).${type}Value();
-#else
-        $field = $utils.castIfNecessary($type) values[$arrayIndex];
-#end
-#if($utils.isPrimitiveClass($type) && !$property.isTagExcluded()
-    && !$property.isLiteralOnly() )
-#set ($arrayIndex = $arrayIndex + 1)
-        ${field}Set = ((Boolean) values[$arrayIndex]).booleanValue();
-#end
-#end
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/componentClassMacros11.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/componentClassMacros11.vm
deleted file mode 100644
index 25af52b..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/componentClassMacros11.vm
+++ /dev/null
@@ -1,4 +0,0 @@
-## Macro definitions for component class definition
-##
-## Velocity macros defined in this file will be available when executing
-## the componentClass11.vm template file.
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/facelets-taglib.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/facelets-taglib.vm
deleted file mode 100644
index 21faac3..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/facelets-taglib.vm
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT 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 facelet-taglib
-  PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
-<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet">
-
-    <namespace>$uri</namespace>
-
-    <!-- Component Tags -->
-#set ($componentList = ${model.getComponents()})
-#foreach( $component in $componentList )
-#if ($modelIds.contains($component.modelId) 
-    && ($component.name))
-#if (!$component.isConfigExcluded())
-#if ($utils.getTagPrefix($component.name) == $shortname)
-    <tag>
-        <tag-name>$utils.getTagName($component.name)</tag-name>
-        <component>
-            <component-type>$component.type</component-type>
-#if ($component.rendererType)
-#if (!($component.rendererType == ""))
-            <renderer-type>$component.rendererType</renderer-type>
-#end
-#end
-#if ($component.tagHandler)
-            <handler-class>$component.tagHandler</handler-class>
-#end
-        </component>
-    </tag>
-#end
-#end
-#end
-#end
-
-   <!-- Converter tags -->
-#set ($componentList = ${model.getConverters()})
-#foreach( $component in $componentList )
-#if ($modelIds.contains($component.modelId) 
-    && ($component.name))
-#if ($component.converterId)
-#if ($utils.getTagPrefix($component.name) == $shortname) 
-    <tag>
-        <tag-name>$utils.getTagName($component.name)</tag-name>
-        <converter>
-            <converter-id>$component.converterId</converter-id>
-        </converter>
-    </tag>
-#end
-#end
-#end
-#end
-
-   <!-- Validator tags -->
-#set ($componentList = ${model.getValidators()})
-#foreach( $component in $componentList )
-#if ($modelIds.contains($component.modelId) 
-    && ($component.name))
-#if ($component.validatorId)
-#if ($utils.getTagPrefix($component.name) == $shortname)
-    <tag>
-        <tag-name>$utils.getTagName($component.name)</tag-name>
-        <validator>
-            <validator-id>$component.validatorId</validator-id>
-        </validator>      
-    </tag>
-#end
-#end
-#end
-#end
-    
-   <!-- Single Tags -->
-#set ($tagList = $model.getTags())
-#foreach( $tag in $tagList )
-#if ($modelIds.contains($tag.modelId))
-#if ($tag.tagHandler)
-#if ($utils.getTagPrefix($tag.name) == $shortname)
-   <tag>
-      <tag-name>$utils.getTagName($tag.name)</tag-name>
-      <handler-class>$tag.tagHandler</handler-class>
-   </tag>
-#end
-#end
-#end
-#end
-
-</facelet-taglib>
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/faces-config11.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/faces-config11.vm
deleted file mode 100644
index f688b2e..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/faces-config11.vm
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-
-<!DOCTYPE faces-config PUBLIC
- "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
- "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
-
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
--->
-
-<faces-config xmlns="http://java.sun.com/JSF/Configuration">
-
-$baseContent
-
-#set ($componentList = ${model.getComponents()})
-#foreach( $component in $componentList )
-#if ($modelIds.contains($component.modelId) 
-    && !($component.className.contains("UIComponent"))
-    && !($component.isConfigExcluded()))
-  <component>
-    <component-type>$component.type</component-type>
-    <component-class>$component.className</component-class>
-  </component>    
-#end
-#end
-#set ($converterList = ${model.getConverters()})
-#foreach( $converter in $converterList )
-#if ($modelIds.contains($converter.modelId))
-  <converter>
-    <converter-id>$converter.converterId</converter-id>
-    <converter-class>$converter.className</converter-class>
-  </converter>
-#end
-#end
-#set ($validatorList = ${model.getValidators()})
-#foreach( $validator in $validatorList )
-#if ($modelIds.contains($validator.modelId) &&
-    !($validator.isConfigExcluded().booleanValue()) &&
-    $validator.validatorId)
-  <validator>
-    <validator-id>$validator.validatorId</validator-id>
-    <validator-class>$validator.className</validator-class>
-  </validator>
-#end
-#end
-#set ($renderKitList = ${model.getRenderKits()})
-#foreach( $renderKit in $renderKitList )
-  <render-kit>
-    <render-kit-id>$renderKit.renderKitId</render-kit-id>
-#if ($renderKit.className)
-    <render-kit-class>$renderKit.className</render-kit-class>
-#end
-#set ($rendererList = ${renderKit.getRenderers()})
-#foreach( $renderer in $rendererList )
-      <renderer>
-        <component-family>$renderer.componentFamily</component-family>
-        <renderer-type>$renderer.rendererType</renderer-type>
-        <renderer-class>$renderer.className</renderer-class>
-      </renderer>
-#end
-  </render-kit>
-#end
-</faces-config>
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/faces-config12.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/faces-config12.vm
deleted file mode 100644
index 21630ca..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/faces-config12.vm
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
--->
-
-<faces-config 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-facesconfig_1_2.xsd" 
-              version="1.2">
-
-$baseContent
-
-#set ($componentList = ${model.getComponents()})
-#foreach( $component in $componentList )
-#if ($modelIds.contains($component.modelId) 
-    && !($component.className.contains("UIComponent"))
-    && !($component.isConfigExcluded()))
-  <component>
-    <component-type>$component.type</component-type>
-    <component-class>$component.className</component-class>
-  </component>    
-#end
-#end
-#set ($converterList = ${model.getConverters()})
-#foreach( $converter in $converterList )
-#if ($modelIds.contains($converter.modelId))
-  <converter>
-    <converter-id>$converter.converterId</converter-id>
-    <converter-class>$converter.className</converter-class>
-  </converter>
-#end
-#end
-#set ($validatorList = ${model.getValidators()})
-#foreach( $validator in $validatorList )
-#if ($modelIds.contains($validator.modelId) &&
-    !($validator.isConfigExcluded().booleanValue()) &&
-    $validator.validatorId)
-  <validator>
-    <validator-id>$validator.validatorId</validator-id>
-    <validator-class>$validator.className</validator-class>
-  </validator>
-#end
-#end
-#set ($renderKitList = ${model.getRenderKits()})
-#foreach( $renderKit in $renderKitList )
-  <render-kit>
-    <render-kit-id>$renderKit.renderKitId</render-kit-id>
-#if ($renderKit.className)
-    <render-kit-class>$renderKit.className</render-kit-class>
-#end
-#set ($rendererList = ${renderKit.getRenderers()})
-#foreach( $renderer in $rendererList )
-      <renderer>
-        <component-family>$renderer.componentFamily</component-family>
-        <renderer-type>$renderer.rendererType</renderer-type>
-        <renderer-class>$renderer.className</renderer-class>
-      </renderer>
-#end
-  </render-kit>
-#end
-</faces-config>
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/myfaces_html.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/myfaces_html.vm
deleted file mode 100644
index b467dce..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/myfaces_html.vm
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
--->
-<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
-<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
-
-$baseContent
-
-#set ($componentList = ${model.getComponents()})
-#foreach( $component in $componentList )
-#if ($modelIds.contains($component.modelId) 
-    && ($component.name))
-#if ($utils.getTagPrefix($component.name) == "h") 
-   <tag>
-      <name>$utils.getTagName($component.name)</name>
-      <tag-class>$component.tagClass</tag-class>
-      <body-content>JSP</body-content>
-      <description></description>
-      
-#set ($propertyList = ${component.propertyList})
-#foreach( $property in $propertyList )
-#if (!$property.tagExcluded)
-      <attribute>
-         <name>$property.name</name>
-         <required>$property.isRequired()</required>
-         <rtexprvalue>false</rtexprvalue>
-         <type>java.lang.String</type>
-         <description></description>
-      </attribute>
-#end
-#end
-   </tag>
-#end
-#end
-#end
-</taglib>
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/tagClass11.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/tagClass11.vm
deleted file mode 100644
index 3768639..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/tagClass11.vm
+++ /dev/null
@@ -1,170 +0,0 @@
-// WARNING: This file was automatically generated. Do not edit it directly,
-//          or you will lose your changes.
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- * 
- *  http://www.apache.org/licenses/LICENSE-2.0
- * 
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package ${component.tagPackage};
-
-import javax.faces.component.UIComponent;
-import javax.faces.el.ValueBinding;
-import javax.faces.context.FacesContext;
-import ${component.tagSuperclass};
-$utils.importTagClasses($component)
-
-// Generated from class ${component.sourceClassName}.
-//
-// WARNING: This file was automatically generated. Do not edit it directly,
-//          or you will lose your changes.
-public class $utils.getClassFromFullClass($component.tagClass) extends ${utils.getClassFromFullClass($component.tagSuperclass)}{
-
-    public $utils.getClassFromFullClass($component.tagClass)()
-    {    
-    }
-    
-    public String getComponentType()
-    {
-#if ($component.type)
-        return "$component.type";
-#else
-        return null;
-#end
-    }
-
-    public String getRendererType()
-    {
-#if ($component.rendererType && !($component.rendererType == ""))
-        return "$component.rendererType";
-#else
-        return null;
-#end
-    }
-
-#set ($propertyList = ${component.propertyTagList})
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($type = $utils.getJspPropertyType11($property))
- 
-    private $type $field;
-    
-#set ($var = $utils.getVariableFromName($property.name))
-    public void $utils.getPrefixedPropertyName("set", $property.jspName)($type $var)
-    {
-        $field = $var;
-    }
-#end
-
-    protected void setProperties(UIComponent component)
-    {
-        if (!(component instanceof $component.className))
-        {
-            throw new IllegalArgumentException("Component "+
-                component.getClass().getName() +" is no $component.className");
-        }
-        
-        $component.className comp = ($component.className) component;
-        
-        super.setProperties(component);
-        
-        FacesContext context = getFacesContext();
-
-#foreach( $property in $propertyList )##            1
-#set ($field = $property.fieldName)
-#set ($type = $utils.getJspPropertyType11($property))
-#if ($utils.isConverter($property.className))##                   2
-        if ($field != null)
-        {
-            if (isValueReference($field))
-            {
-                ValueBinding vb = context.getApplication().createValueBinding($field);
-                comp.setValueBinding("$property.name", vb);
-            }
-            else
-            {
-                Converter converter = getFacesContext().getApplication().createConverter($field);
-                comp.setConverter(converter);
-            }
-        }
-#elseif ($property.isMethodBinding())##                 2
-        if ($field != null)
-        {
-#if ($utils.isStringMethodBindingReturnType($property.methodBindingSignature))##3
-            MethodBinding mb;
-            if (isValueReference($field))
-            {
-                mb = context.getApplication().createMethodBinding(
-                    $field, $utils.getSignatureParams($property.methodBindingSignature));            
-            }
-            else
-            {
-#if ($property.jspName == "action")##                      4
-                mb = new org.apache.myfaces.shared_impl.el.SimpleActionMethodBinding($field);
-#else##                                                   4
-                throw new IllegalStateException("Invalid expression " + $field);
-#end##                                                    4
-            }
-#else##                                                 3
-            MethodBinding mb = context.getApplication().createMethodBinding(
-                $field, $utils.getSignatureParams($property.methodBindingSignature));
-#end##                                                  3
-            comp.${utils.getPrefixedPropertyName("set",$property.name)}(mb);
-        }
-#else##                                               2
-        if ($field != null)
-        {
-#if ($property.isLiteralOnly())##                         3
-#set ($className = $utils.getPrimitiveType($property.className))
-#if ($utils.isPrimitiveClass($className))##               4
-            comp.getAttributes().put("$property.name", ${utils.getBoxedClass($className)}.valueOf($field));
-#else##                                                   4
-            comp.getAttributes().put("$property.name", $field);
-#end##                                                    4
-#else##                                                 3
-            if (isValueReference($field))
-            {
-                ValueBinding vb = context.getApplication().createValueBinding($field);
-                comp.setValueBinding("$property.name", vb);
-            }
-            else
-            {
-#set ($className = $utils.getPrimitiveType($property.className))
-#if ($utils.isPrimitiveClass($className))##               4
-                comp.getAttributes().put("$property.name", ${utils.getBoxedClass($className)}.valueOf($field));
-#else##                                                   4
-                comp.getAttributes().put("$property.name", $field);
-#end##                                                    4
-            }
-#end##                                                  3
-        } 
-#end##                                                2
-#end##                                              1
-    }
-
-    public void release()
-    {
-        super.release();
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#if($utils.getJspPropertyType11($property) == "boolean")
-#set ($empty = "false")
-#else
-#set ($empty = "null")
-#end
-        $field = $empty;
-#end
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/tagClass12.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/tagClass12.vm
deleted file mode 100644
index 7c9fb6a..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/tagClass12.vm
+++ /dev/null
@@ -1,179 +0,0 @@
-// WARNING: This file was automatically generated. Do not edit it directly,
-//          or you will lose your changes.
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- * 
- *  http://www.apache.org/licenses/LICENSE-2.0
- * 
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package ${component.tagPackage};
-
-import javax.faces.component.UIComponent;
-import javax.el.ValueExpression;
-import javax.el.MethodExpression;
-import javax.faces.context.FacesContext;
-$utils.importTagClasses12($component)
-
-// Generated from class ${component.sourceClassName}.
-//
-// WARNING: This file was automatically generated. Do not edit it directly,
-//          or you will lose your changes.
-public class $utils.getClassFromFullClass($component.tagClass)
-#if (${component.tagSuperclass})
-    extends ${component.tagSuperclass}
-#else
-    extends javax.faces.webapp.UIComponentTag
-#end
-{
-    public $utils.getClassFromFullClass($component.tagClass)()
-    {    
-    }
-    
-    public String getComponentType()
-    {
-#if ($component.type)
-        return "$component.type";
-#else
-        return null;
-#end
-    }
-
-    public String getRendererType()
-    {
-#if ($component.rendererType && !($component.rendererType == ""))
-        return "$component.rendererType";
-#else
-        return null;
-#end
-    }
-
-#set ($propertyList = ${component.propertyTagList})
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($type = $utils.getJspPropertyType12($property))
-#if ($property.isLiteralOnly() && $property.className == "boolean")
-#set ($type = "String")
-#end
-    private $type $field;
-    
-#set ($var = $utils.getVariableFromName($property.name))
-    public void $utils.getPrefixedPropertyName("set", $property.jspName)($type $var)
-    {
-        $field = $var;
-    }
-#end
-
-    protected void setProperties(UIComponent component)
-    {
-        if (!(component instanceof $component.className))
-        {
-            throw new IllegalArgumentException("Component "+
-                component.getClass().getName() +" is no $component.className");
-        }
-        
-        $component.className comp = ($component.className) component;
-        
-        super.setProperties(component);
-        
-        FacesContext context = getFacesContext();
-
-#foreach( $property in $propertyList )##            1
-#set ($field = $property.fieldName)
-#set ($type = $utils.getJspPropertyType12($property))
-#if ($property.isLiteralOnly() && $property.className == "boolean")
-#set ($type = "String")
-#end
-#if ($utils.isConverter($property.className))##                   2
-        if ($field != null)
-        {
-            if (!${field}.isLiteralText())
-            {
-                comp.setValueExpression("$property.name", $field);
-            }
-            else
-            {
-                String s = ${field}.getExpressionString();
-                if (s != null)
-                {            
-                    Converter converter = getFacesContext().getApplication().createConverter(s);
-                    comp.setConverter(converter);
-                }
-            }
-        }
-#elseif ($property.isMethodBinding())##                 2
-        if ($field != null)
-        {
-#if ($property.jspName == "actionListener")
-            comp.addActionListener(new MethodExpressionActionListener($field));
-#elseif ($property.jspName == "valueChangeListener")
-            comp.addValueChangeListener(new MethodExpressionValueChangeListener($field));
-#elseif ($property.jspName == "validator")
-            comp.addValidator(new MethodExpressionValidator($field));
-#elseif ($utils.isStringMethodBindingReturnType($property.methodBindingSignature))##3
-            MethodBinding mb;
-            if (isValueReference($field))
-            {
-                mb = context.getApplication().createMethodBinding(
-                    $field, $utils.getSignatureParams($property.methodBindingSignature));            
-            }
-            else
-            {
-                throw new IllegalStateException("Invalid expression " + $field);
-            }
-            comp.${utils.getPrefixedPropertyName("set",$property.name)}(mb);
-#else##                                                 3
-            MethodBinding mb = context.getApplication().createMethodBinding(
-                $field, $utils.getSignatureParams($property.methodBindingSignature));
-            comp.${utils.getPrefixedPropertyName("set",$property.name)}(mb);
-#end##                                                  3
-        }
-#elseif ($property.isMethodExpression())##            2
-        if ($field != null)
-        {
-#if ($property.jspName == "action")
-            comp.setActionExpression($field);
-#elseif ($property.jspName == "actionListener")
-            comp.addActionListener(new MethodExpressionActionListener($field));
-#else
-            comp.${utils.getPrefixedPropertyName("set",$property.name)}($field);
-#end        
-        }        
-#else##                                               2
-        if ($field != null)
-        {
-#if ($property.isLiteralOnly())##                         3
-#if ($utils.isPrimitiveClass($property.className))##               4
-            comp.getAttributes().put("$property.name", ${utils.getBoxedClass($property.className)}.valueOf($field));
-#else##                                                   4
-            comp.getAttributes().put("$property.name", $field);
-#end##                                                    4
-#else##                                                 3
-            comp.setValueExpression("$property.name", $field);
-#end##                                                  3
-        } 
-#end##                                                2
-#end##                                              1
-    }
-
-    public void release()
-    {
-        super.release();
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($empty = "null")
-        $field = $empty;
-#end
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/tagClassMacros11.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/tagClassMacros11.vm
deleted file mode 100644
index e69de29..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/tagClassMacros11.vm
+++ /dev/null
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/tomahawk12.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/tomahawk12.vm
deleted file mode 100644
index 8e62161..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/tomahawk12.vm
+++ /dev/null
@@ -1,229 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT 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 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/web-jsptaglibrary_2_1.xsd" 
-        version="2.1">
-  <tlib-version>1.1.7</tlib-version>
-   <short-name>$shortname</short-name>
-   <uri>$uri</uri>
-   <display-name>$displayname</display-name>
-   <description>$description</description>
-
-$baseContent
-
-    <!-- Component Tags -->
-#set ($componentList = ${model.getComponents()})
-#foreach( $component in $componentList )
-#if ($modelIds.contains($component.modelId) 
-    && ($component.name))
-#if ($utils.getTagPrefix($component.name) == $shortname) 
-   <tag>
-      <name>$utils.getTagName($component.name)</name>
-      <tag-class>$component.tagClass</tag-class>
-#if ($component.bodyContent)
-      <body-content>$component.bodyContent</body-content>
-#else
-      <body-content>JSP</body-content>
-#end
-      <description><![CDATA[$component.longDescription]]></description>
-      
-#set ($propertyList = ${component.propertyList})
-#foreach( $property in $propertyList )
-#if (!$property.isTagExcluded())
-      <attribute>
-         <name>$property.jspName</name>
-#if ($property.isRequired())
-         <required>$property.isRequired()</required>
-#end
-#if ($property.isMethodExpression() || $property.isMethodBinding())
-#if ($property.getMethodBindingSignature())
-        <deferred-method>
-#set ($sig = $property.getMethodBindingSignature())
-            <method-signature>$sig.returnType myMethod( $sig.parameterTypesAsString )</method-signature>
-
-        </deferred-method>
-#else
-## This is a very special case. If a property is MethodBinding or MethodExpression
-## this should have a signature. If not, for allow multiple MethodBinding
-## simulate a ValueExpression and write a custom code like in 
-## org.apache.myfaces.custom.suggestajax.AbstractSuggestAjaxTag
-         <deferred-value/>
-#end
-#elseif ($property.isLiteralOnly())
-         <rtexprvalue>false</rtexprvalue>
-#else
-#if ( "$!property.isRtexprvalue()" == "")
-#set ($type = $utils.getClassFromFullClass($property.className))
-#if ($type == "String")
-         <deferred-value></deferred-value>
-#else
-         <deferred-value>
-             <type>$property.className</type>
-         </deferred-value>
-#end
-#else
-         <rtexprvalue>$property.isRtexprvalue().booleanValue()</rtexprvalue>
-#end
-#end
-#if ($property.longDescription)
-         <description><![CDATA[$property.longDescription]]></description>
-#else
-         <description><![CDATA[]]></description>
-#end
-      </attribute>
-#end
-#end
-   </tag>
-#end
-#end
-#end
-   <!-- Converter tags -->
-#set ($componentList = ${model.getConverters()})
-#foreach( $component in $componentList )
-#if ($modelIds.contains($component.modelId) 
-    && ($component.name))
-#if ($utils.getTagPrefix($component.name) == $shortname) 
-   <tag>
-      <name>$utils.getTagName($component.name)</name>
-      <tag-class>$component.tagClass</tag-class>
-#if ($component.bodyContent)
-      <body-content>$component.bodyContent</body-content>
-#else
-      <body-content>empty</body-content>
-#end
-      <description><![CDATA[$component.longDescription]]></description>
-      
-#set ($propertyList = ${component.propertyList})
-#foreach( $property in $propertyList )
-#if (!$property.isTagExcluded())
-      <attribute>
-         <name>$property.name</name>
-#if ($property.isRequired())
-         <required>$property.isRequired()</required>
-#end
-#if ($property.isLiteralOnly())
-         <rtexprvalue>false</rtexprvalue>
-#else
-#set ($type = $utils.getClassFromFullClass($property.className))
-#if ($type == "String")
-         <deferred-value></deferred-value>
-#else
-         <deferred-value>
-             <type>$property.className</type>
-         </deferred-value>
-#end
-#end
-#if ($property.longDescription)
-         <description><![CDATA[$property.longDescription]]></description>
-#else
-         <description><![CDATA[]]></description>
-#end
-      </attribute>
-#end
-#end
-   </tag>
-#end
-#end
-#end
-   <!-- Validator tags -->
-#set ($componentList = ${model.getValidators()})
-#foreach( $component in $componentList )
-#if ($modelIds.contains($component.modelId) 
-    && ($component.name))
-#if ($utils.getTagPrefix($component.name) == $shortname) 
-   <tag>
-      <name>$utils.getTagName($component.name)</name>
-      <tag-class>$component.tagClass</tag-class>
-#if ($component.bodyContent)
-      <body-content>$component.bodyContent</body-content>
-#else
-      <body-content>empty</body-content>
-#end
-      <description><![CDATA[$component.longDescription]]></description>
-      
-#set ($propertyList = ${component.propertyList})
-#foreach( $property in $propertyList )
-#if (!$property.isTagExcluded())
-      <attribute>
-         <name>$property.name</name>
-#if ($property.isRequired())
-         <required>$property.isRequired()</required>
-#end
-#if ($property.isLiteralOnly())
-         <rtexprvalue>false</rtexprvalue>
-#else
-#set ($type = $utils.getClassFromFullClass($property.className))
-#if ($type == "String")
-         <deferred-value></deferred-value>
-#else
-         <deferred-value>
-             <type>$property.className</type>
-         </deferred-value>
-#end
-#end
-#if ($property.longDescription)
-         <description><![CDATA[$property.longDescription]]></description>
-#else
-         <description><![CDATA[]]></description>
-#end
-      </attribute>
-#end
-#end
-   </tag>
-#end
-#end
-#end
-   <!-- Single Tags -->
-#set ($tagList = $model.getTags())
-#foreach( $tag in $tagList )
-#if ($modelIds.contains($tag.modelId))
-   <tag>
-      <name>$utils.getTagName($tag.name)</name>
-      <tag-class>$tag.className</tag-class>
-      <body-content>$tag.bodyContent</body-content>
-      <description><![CDATA[$tag.longDescription]]></description>
-#set ($attributeList = ${tag.attributeList})
-#foreach( $attribute in $attributeList )
-      <attribute>
-         <name>$attribute.name</name>
-         <required>$attribute.isRequired()</required>
-#set ($type = $utils.getClassFromFullClass($attribute.className))
-#if ($type == "ValueExpression")
-         <deferred-value></deferred-value>
-#else
-         <rtexprvalue>$attribute.isRtexprvalue()</rtexprvalue>
-#if ($attribute.className)         
-         <type>$attribute.className</type>
-#else
-         <type>java.lang.String</type>
-#end
-#end
-#if ($property.longDescription)
-         <description><![CDATA[$property.longDescription]]></description>
-#else
-         <description><![CDATA[]]></description>
-#end
-      </attribute>
-#end
-   </tag>
-#end
-#end
-</taglib>
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/trinidad-faces-config12.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/trinidad-faces-config12.vm
deleted file mode 100644
index 1f12877..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/trinidad-faces-config12.vm
+++ /dev/null
@@ -1,176 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
--->
-
-<faces-config 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-facesconfig_1_2.xsd" 
-              version="1.2">
-
-$baseContent
-
-#set ($componentList = ${model.getComponents()})
-#foreach( $component in $componentList )
-#if ($modelIds.contains($component.modelId)
-    && !($component.isConfigExcluded()))
-  <component>
-#if ($component.longDescription)
-    <description><![CDATA[$component.longDescription]]></description>
-#end    
-    <component-type>$component.type</component-type>
-    <component-class>$component.className</component-class>
-#set ($facetList = ${component.facetList})
-#foreach( $facet in $facetList )
-    <facet>
-#if ($facet.longDescription)
-        <description><![CDATA[$facet.longDescription]]></description>
-#end
-        <facet-name>$facet.name</facet-name>
-    </facet>
-#end
-#set ($propertyList = ${component.propertyList})
-#foreach( $property in $propertyList )
-## Theorically, it should only add properties visible on tld or transient
-## (not visible on tld but used on renderers like "transient").
-## On myfaces core 1.2, only "transient" property use it.
-## But inclusive, some tagExcluded properties belongs to the
-## component class or are used by some reason (for example in UIInput 
-## valid, localValueSet or submittedValue).
-## Anyway, this information works only as metadata.
-#if (!$property.name.equals("binding"))  ## binding is used only in tag class or tag handler
-## !$property.isTagExcluded() || $property.isTransient()
-#if ( true )
-    <property>
-#if ($property.longDescription)
-         <description><![CDATA[$property.longDescription]]></description>
-#end
-         <property-name>$property.name</property-name>
-         <property-class>$property.className</property-class>
-#if($utils.getDefaultValueField($property))
-#set ($defaultValue = $utils.getDefaultValueField($property))
-#if ($defaultValue.charAt(0) == '"')
-#set ($dVsize = $defaultValue.length() - 1)
-#set ($defaultValue = $defaultValue.substring(1,$dVsize) ) 
-#end
-         <default-value>$defaultValue</default-value>
-#end
-    </property>
-#end
-#end
-#end
-##    <component-extension>
-##      <component-family>$component.family</component-family>
-###if ($component.rendererType)
-###if (!($component.rendererType == ""))
-##      <renderer-type>$component.rendererType</renderer-type>
-###end
-###end
-##    </component-extension>
-  </component>    
-#end
-#end
-#set ($converterList = ${model.getConverters()})
-#foreach( $converter in $converterList )
-#if ($modelIds.contains($converter.modelId)
-    && !($converter.isConfigExcluded()))
-  <converter>
-#if ($converter.longDescription)
-    <description><![CDATA[$converter.longDescription]]></description>
-#end    
-    <converter-id>$converter.converterId</converter-id>
-    <converter-class>$converter.className</converter-class>
-#set ($propertyList = ${converter.propertyList})
-#foreach( $property in $propertyList )
-#if (!$property.name.equals("binding"))  ## binding is used only in tag class or tag handler
-    <property>
-#if ($property.longDescription)
-         <description><![CDATA[$property.longDescription]]></description>
-#end
-         <property-name>$property.name</property-name>
-         <property-class>$property.className</property-class>
-#if($utils.getDefaultValueField($property))
-#set ($defaultValue = $utils.getDefaultValueField($property))
-#if ($defaultValue.charAt(0) == '"')
-#set ($dVsize = $defaultValue.length() - 1)
-#set ($defaultValue = $defaultValue.substring(1,$dVsize) ) 
-#end
-         <default-value>$defaultValue</default-value>
-#end
-    </property>
-#end
-#end
-  </converter>
-#end
-#end
-#set ($validatorList = ${model.getValidators()})
-#foreach( $validator in $validatorList )
-#if ($modelIds.contains($validator.modelId) &&
-    !($validator.isConfigExcluded().booleanValue()) &&
-    $validator.validatorId)
-  <validator>
-#if ($validator.longDescription)
-    <description><![CDATA[$validator.longDescription]]></description>
-#end
-#if ($validator.name)
-   <display-name>$utils.getTagName($validator.name)</display-name>
-#end
-    <validator-id>$validator.validatorId</validator-id>
-    <validator-class>$validator.className</validator-class>
-#set ($propertyList = ${validator.propertyList})
-#foreach( $property in $propertyList )
-#if (!$property.name.equals("binding"))  ## binding is used only in tag class or tag handler
-    <property>
-#if ($property.longDescription)
-         <description><![CDATA[$property.longDescription]]></description>
-#end
-         <property-name>$property.name</property-name>
-         <property-class>$property.className</property-class>
-#if($utils.getDefaultValueField($property))
-#set ($defaultValue = $utils.getDefaultValueField($property))
-#if ($defaultValue.charAt(0) == '"')
-#set ($dVsize = $defaultValue.length() - 1)
-#set ($defaultValue = $defaultValue.substring(1,$dVsize) ) 
-#end
-         <default-value>$defaultValue</default-value>
-#end
-    </property>
-#end
-#end
-  </validator>
-#end
-#end
-#set ($renderKitList = ${model.getRenderKits()})
-#foreach( $renderKit in $renderKitList )
-  <render-kit>
-    <render-kit-id>$renderKit.renderKitId</render-kit-id>
-#if ($renderKit.className)
-    <render-kit-class>$renderKit.className</render-kit-class>
-#end
-#set ($rendererList = ${renderKit.getRenderers()})
-#foreach( $renderer in $rendererList )
-      <renderer>
-        <component-family>$renderer.componentFamily</component-family>
-        <renderer-type>$renderer.rendererType</renderer-type>
-        <renderer-class>$renderer.className</renderer-class>
-      </renderer>
-#end
-  </render-kit>
-#end
-</faces-config>
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/trinidad-tld12.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/trinidad-tld12.vm
deleted file mode 100644
index 6cde7e0..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/trinidad-tld12.vm
+++ /dev/null
@@ -1,249 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT 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 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/web-jsptaglibrary_2_1.xsd" 
-        version="2.1">
-   <!--
-   <tlib-version>$version</tlib-version>
-   <short-name>$shortname</short-name>
-   <uri>$uri</uri>
-   <display-name>$displayname</display-name>
-   <description>$description</description>
-   -->
-
-$baseContent
-
-    <!-- Component Tags -->
-#set ($componentList = ${model.getComponents()})
-#foreach( $component in $componentList )
-#if ($modelIds.contains($component.modelId) 
-    && ($component.name))
-#if ($utils.getTagPrefix($component.name) == $shortname) 
-   <tag>
-      <name>$utils.getTagName($component.name)</name>
-      <tag-class>$component.tagClass</tag-class>
-#if ($component.bodyContent)
-      <body-content>$component.bodyContent</body-content>
-#else
-      <body-content>JSP</body-content>
-#end
-      <description><![CDATA[$component.longDescription]]></description>
-      
-#set ($propertyList = ${component.propertyList})
-#foreach( $property in $propertyList )
-#if (!$property.isTagExcluded())
-      <attribute>
-         <name>$property.jspName</name>
-#if ($property.isRequired())
-         <required>$property.isRequired()</required>
-#end
-#if ($property.isMethodExpression() || $property.isMethodBinding())
-#if ($property.getMethodBindingSignature())
-        <deferred-method>
-#set ($sig = $property.getMethodBindingSignature())
-            <method-signature>$sig.returnType myMethod(${sig.parameterTypesAsString})</method-signature>
-
-        </deferred-method>
-#else
-## This is a very special case. If a property is MethodBinding or MethodExpression
-## this should have a signature. If not, for allow multiple MethodBinding
-## simulate a ValueExpression and write a custom code like in 
-## org.apache.myfaces.custom.suggestajax.AbstractSuggestAjaxTag
-         <deferred-value/>
-#end
-#elseif ($property.isLiteralOnly())
-         <rtexprvalue>false</rtexprvalue>
-#else
-#if ( "$!property.isRtexprvalue()" == "")
-#set ($type = $utils.getClassFromFullClass($property.className))
-#if ($type == "String" || $type == "String[]" || $type == "Object" || $type == "List" || $type == "Date" || $type == "RowKeySet" || $type == "int[]")
-         <deferred-value></deferred-value>
-#else
-         <deferred-value>
-             <type>$property.className</type>
-         </deferred-value>
-#end
-#else
-         <rtexprvalue>$property.isRtexprvalue().booleanValue()</rtexprvalue>
-#end
-#end
-#if ($property.longDescription)
-         <description><![CDATA[$property.longDescription]]></description>
-#else
-         <description><![CDATA[]]></description>
-#end
-      </attribute>
-#end
-#end
-   </tag>
-#end
-#end
-#end
-   <!-- Converter tags -->
-#set ($componentList = ${model.getConverters()})
-#foreach( $component in $componentList )
-#if ($modelIds.contains($component.modelId) 
-    && ($component.name))
-#if ($utils.getTagPrefix($component.name) == $shortname) 
-   <tag>
-      <name>$utils.getTagName($component.name)</name>
-      <tag-class>$component.tagClass</tag-class>
-#if ($component.bodyContent)
-      <body-content>$component.bodyContent</body-content>
-#else
-      <body-content>empty</body-content>
-#end
-#if ($component.longDescription)
-      <description><![CDATA[$component.longDescription]]></description>
-#end
-
-      <attribute>
-        <name>id</name>
-      </attribute>
-#set ($propertyList = ${component.propertyList})
-#foreach( $property in $propertyList )
-#if (!$property.isTagExcluded())
-      <attribute>
-         <name>$property.name</name>
-#if ($property.isRequired())
-         <required>$property.isRequired()</required>
-#end
-#if ($property.isLiteralOnly())
-         <rtexprvalue>false</rtexprvalue>
-#else
-#set ($type = $utils.getClassFromFullClass($property.className))
-#if ($type == "String" || $type == "String[]" || $type == "Object" || $type == "List" || $type == "Date" || $type == "RowKeySet" || $type == "int[]" || $type == "Locale" || $type == "TimeZone")
-         <deferred-value></deferred-value>
-#else
-         <deferred-value>
-             <type>$property.className</type>
-         </deferred-value>
-#end
-#end
-#if ($property.longDescription)
-         <description><![CDATA[$property.longDescription]]></description>
-#else
-         <description><![CDATA[]]></description>
-#end
-      </attribute>
-#end
-#end
-   </tag>
-#end
-#end
-#end
-   <!-- Validator tags -->
-#set ($componentList = ${model.getValidators()})
-#foreach( $component in $componentList )
-#if ($modelIds.contains($component.modelId) 
-    && ($component.name))
-#if ($utils.getTagPrefix($component.name) == $shortname) 
-   <tag>
-      <name>$utils.getTagName($component.name)</name>
-      <tag-class>$component.tagClass</tag-class>
-#if ($component.bodyContent)
-      <body-content>$component.bodyContent</body-content>
-#else
-      <body-content>empty</body-content>
-#end
-      <description><![CDATA[$component.longDescription]]></description>
-      
-      <attribute>
-        <name>id</name>
-      </attribute>
-#set ($propertyList = ${component.propertyList})
-#foreach( $property in $propertyList )
-#if (!$property.isTagExcluded())
-      <attribute>
-         <name>$property.name</name>
-#if ($property.isRequired())
-         <required>$property.isRequired()</required>
-#end
-#if ($property.isLiteralOnly())
-         <rtexprvalue>false</rtexprvalue>
-#else
-#set ($type = $utils.getClassFromFullClass($property.className))
-#if ($type == "String" || $type == "String[]" || $type == "Object" || $type == "List" || $type == "Date" || $type == "RowKeySet" || $type == "int[]" || $type == "DateListProvider")
-         <deferred-value></deferred-value>
-#else
-         <deferred-value>
-             <type>$property.className</type>
-         </deferred-value>
-#end
-#end
-#if ($property.longDescription)
-         <description><![CDATA[$property.longDescription]]></description>
-#else
-         <description><![CDATA[]]></description>
-#end
-      </attribute>
-#end
-#end
-   </tag>
-#end
-#end
-#end
-   <!-- Single Tags -->
-#set ($tagList = $model.getTags())
-#foreach( $tag in $tagList )
-#if ($modelIds.contains($tag.modelId))
-   <tag>
-      <name>$utils.getTagName($tag.name)</name>
-      <tag-class>$tag.className</tag-class>
-      <body-content>$tag.bodyContent</body-content>
-#if ($tag.longDescription)
-      <description><![CDATA[$tag.longDescription]]></description>
-#end
-#set ($attributeList = ${tag.attributeList})
-#foreach( $attribute in $attributeList )
-#if (!$attribute.isExclude().booleanValue())
-      <attribute>
-         <name>$attribute.name</name>
-#if ($attribute.isRequired())
-         <required>$attribute.isRequired()</required>
-#end
-#set ($type = $utils.getClassFromFullClass($attribute.className))
-#if ($type == "MethodExpression")
-        <deferred-method>
-          <method-signature>${attribute.deferredMethodSignature}</method-signature>
-        </deferred-method>
-#elseif ($type == "ValueExpression")
-         <deferred-value>#if($attribute.deferredValueType)$attribute.deferredValueType#end</deferred-value>
-#else
-         <rtexprvalue>$attribute.isRtexprvalue()</rtexprvalue>
-#if ($attribute.className)         
-         <type>$attribute.className</type>
-#else
-         <type>java.lang.String</type>
-#end
-#end
-#if ($property.longDescription)
-         <description><![CDATA[$property.longDescription]]></description>
-#else
-         <description><![CDATA[]]></description>
-#end
-      </attribute>
-#end
-#end
-   </tag>
-#end
-#end
-</taglib>
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/trinidadComponentClass12.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/trinidadComponentClass12.vm
deleted file mode 100644
index 6947e1b..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/trinidadComponentClass12.vm
+++ /dev/null
@@ -1,210 +0,0 @@
-## Velocity template used to generate trinidad JSF1.2-compatible component classes
-## from component meta-data.
-##
-## Note that there are two types of component generation:
-##  * "subclass mode" (use annotated class as a parent class)
-##  * "template mode" (use annotated class as a template)
-## This template file is used for both.
-##
-## Variable $component refers to a ComponentMeta object to process
-## Variable $utils refers to an instance of MyfacesUtils.
-##
-## When "template mode" is being used then variable $innersource
-## holds a String containing all the non-abstract functions defined
-## in the annotated class.
-##
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- * 
- *  http://www.apache.org/licenses/LICENSE-2.0
- * 
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package ${component.packageName};
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.el.ValueExpression;
-import javax.faces.context.FacesContext;
-$utils.importTagClasses($component)
-
-import org.apache.myfaces.trinidad.bean.FacesBean;
-import org.apache.myfaces.trinidad.bean.PropertyKey;
-import org.apache.myfaces.trinidad.util.ComponentUtils;
-
-#if ($component.isTemplate())
-#set ($generatedClassParent = $component.sourceClassParentClassName)
-#else
-#set ($generatedClassParent = $component.sourceClassName)
-#end
-// Generated from class ${component.sourceClassName}.
-//
-// WARNING: This file was automatically generated. Do not edit it directly,
-//          or you will lose your changes.
-public class ${utils.getClassFromFullClass($component.className)} extends $generatedClassParent
-#if ($component.implements)
-    implements $component.implements
-#end
-{
-#if ($component.serialuid)
-    private static final long serialVersionUID = ${component.serialuid}; 
-#end  
-
-    static public final FacesBean.Type TYPE = new FacesBean.Type(
-       ${generatedClassParent}.TYPE);
-#set ($propertyList = ${component.propertyComponentList})
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($type = $utils.getClassFromFullClass($property.className))
-#set ($key = $utils.getConstantNameFromProperty($property.name , "_KEY"))
-##
-## CALCULATE DEFAULT VALUE
-##
-#if($utils.getDefaultValueField($property)) 
-#set ($defaultValue = $utils.getDefaultValueField($property))
-#if ($defaultValue == "true")
-#set ($defaultValue = "Boolean.TRUE")
-#end
-#if ($defaultValue == "false")
-#set ($defaultValue = "Boolean.FALSE")
-#end
-#if ($type == "char")
-#set ($defaultValue = "'"+$defaultValue+"'")
-#end
-#else
-#set ($defaultValue = false)
-#end
-## CALCULATE CAPABILITIES
-#set ($caps = "")
-#set ($capsCount = 0)
-#if ($property.isMethodBinding() || $property.isLiteralOnly())
-#set ($capsCount = $capsCount + 1)
-#end
-#if ($property.isStateHolder())
-#set ($capsCount = $capsCount + 1)
-#end
-#if ($property.isTransient())
-#set ($capsCount = $capsCount + 1)
-#end
-#if ($property.isMethodBinding() || $property.isLiteralOnly())
-#set ($caps = $caps + "PropertyKey.CAP_NOT_BOUND")
-#if ($capsCount > 1)#set($capsCount = $capsCount - 1)#set($caps=$caps+" | ")#end
-#end
-#if ($property.isStateHolder())
-#set ($caps = $caps + "PropertyKey.CAP_STATE_HOLDER")
-#if ($capsCount > 1)#set($capsCount = $capsCount - 1)#set($caps=$caps+" | ")#end
-#end
-#if ($property.isTransient())
-#set ($caps = $caps + "PropertyKey.CAP_TRANSIENT")
-#if ($capsCount > 1)#set($capsCount = $capsCount - 1)#set($caps=$caps+" | ")#end
-#end
-## This template does not handle PropertyKey.CAP_LIST
-
-    static public final PropertyKey $key =
-        TYPE.registerKey(
-            "$property.name",#if($utils.isPrimitiveClass($type))${utils.getBoxedClass($type)}.class#{else}${type}.class#end
-#if($defaultValue),${defaultValue}#end
-#if ( !$caps.equals("")),${caps}#end);
-#end
-
-    static public final String COMPONENT_FAMILY =
-        "$component.family";
-    static public final String COMPONENT_TYPE =
-        "$component.type";
-##if ($component.rendererType)
-##if (!($component.rendererType == ""))
-##    static public final String DEFAULT_RENDERER_TYPE = 
-##        "$component.rendererType";
-##end
-##end
-
-#if ($innersource)
-    //BEGIN CODE COPIED FROM $component.sourceClassName 
-$innersource
-    //END CODE COPIED FROM $component.sourceClassName
-#end
-
-    public ${utils.getClassFromFullClass($component.className)}()
-    {
-#if ($component.rendererType)
-#if ($component.rendererType == "")
-        super(null);
-#else
-        super("$component.rendererType");
-#end
-#else
-        super(null);
-#end
-    }
-
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($type = $utils.getClassFromFullClass($property.className))
-#set ($key = $utils.getConstantNameFromProperty($property.name , "_KEY"))
-
-    final public $type $utils.getMethodReaderFromProperty($property.name, $type)()
-    {
-#if ($utils.isPrimitiveClass($type))
-#if ($type == "char")
-        return ComponentUtils.resolveCharacter((Character) getProperty($key));
-#elseif ($type == "byte" || $type == "short")
-## There is no ComponentUtils remethod, so we just cast it.
-        return $utils.castIfNecessary($type) getProperty($key);
-#else
-        return ComponentUtils.resolve${utils.getBoxedClass($type)}(getProperty($key));
-#end
-#elseif ($type == "String" || $type == "Locale" || $type == "TimeZone")
-        return ComponentUtils.resolve${utils.getBoxedClass($type)}(getProperty($key));
-#else
-        return $utils.castIfNecessary($type) getProperty($key);
-#end
-    }
-
-    final public void $utils.getPrefixedPropertyName("set", $property.name)($type $utils.getVariableFromName($property.name))
-    {
-#if ($utils.isPrimitiveClass($type))
-#if ($type == "boolean")
-        setProperty($key, $utils.getVariableFromName($property.name) ? Boolean.TRUE : Boolean.FALSE);
-#else
-        setProperty($key, ${utils.getBoxedClass($type)}.valueOf( $utils.getVariableFromName($property.name) ));
-#end
-#else
-        setProperty($key, $utils.getVariableFromName($property.name));
-#end
-    }
-#end
-
-    @Override    
-    public String getFamily()
-    {
-        return COMPONENT_FAMILY;
-    }
-
-    @Override
-    protected FacesBean.Type getBeanType()
-    {
-        return TYPE;
-    }
-    
-    public ${utils.getClassFromFullClass($component.className)}(String rendererType)
-    {
-      super(rendererType);
-    }
-  
-    static
-    {
-        TYPE.lock();
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/trinidadTagClass12.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/trinidadTagClass12.vm
deleted file mode 100644
index 4fa66f1..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/trinidadTagClass12.vm
+++ /dev/null
@@ -1,142 +0,0 @@
-// WARNING: This file was automatically generated. Do not edit it directly,
-//          or you will lose your changes.
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- * 
- *  http://www.apache.org/licenses/LICENSE-2.0
- * 
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package ${component.tagPackage};
-
-import javax.el.ValueExpression;
-import org.apache.myfaces.trinidad.bean.FacesBean;
-##$utils.importTagClasses12($component)
-#set ($addMeMb = false)
-#set ($addMe = false)
-#set ($propertyList = ${component.propertyTagList})
-#foreach( $property in $propertyList )
-#if ($property.isMethodExpression())
-#set ($addMe = true)
-#end
-#if ($property.isMethodBinding())
-#set ($addMeMb = true)
-#end
-#end
-#if ($addMe)
-import javax.el.MethodExpression;
-#end
-#if ($addMeMb)
-import org.apache.myfaces.trinidadinternal.taglib.util.MethodExpressionMethodBinding;
-#end
-
-// Generated from class ${component.sourceClassName}.
-//
-// WARNING: This file was automatically generated. Do not edit it directly,
-//          or you will lose your changes.
-public class $utils.getClassFromFullClass($component.tagClass)
-#if (${component.tagSuperclass})
-    extends ${component.tagSuperclass}
-#else
-    extends javax.faces.webapp.UIComponentTag
-#end
-{
-    public $utils.getClassFromFullClass($component.tagClass)()
-    {    
-    }
-    
-    public String getComponentType()
-    {
-#if ($component.type)
-        return "$component.type";
-#else
-        return null;
-#end
-    }
-
-    public String getRendererType()
-    {
-#if ($component.rendererType && !($component.rendererType == ""))
-        return "$component.rendererType";
-#else
-        return null;
-#end
-    }
-
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($type = $utils.getJspPropertyType12($property))
-#if ($property.isLiteralOnly() && $property.className == "boolean")
-#set ($type = "String")
-#end
-    private $type $field;
-    
-#set ($var = $utils.getVariableFromName($property.name))
-    public void $utils.getPrefixedPropertyName("set", $property.jspName)($type $var)
-    {
-        $field = $var;
-    }
-#end
-
-    @Override
-    protected void setProperties(
-      FacesBean bean)
-    {
-        super.setProperties(bean);
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($type = $utils.getClassFromFullClass($property.className))
-#set ($key = $utils.getConstantNameFromProperty($property.name , "_KEY"))
-#if ($utils.isConverter($property.className))##                   2
-        if ($field != null)
-        {
-            if (!${field}.isLiteralText())
-            {
-                bean.setValueExpression(${component.className}.${key}, $field);
-            }
-            else
-            {
-                String s = ${field}.getExpressionString();
-                if (s != null)
-                {            
-                    Converter converter = getFacesContext().getApplication().createConverter(s);
-                    bean.setProperty(${component.className}.${key}, converter);
-                }
-            }
-        }
-#elseif ($property.isMethodExpression())
-        bean.setProperty(${component.className}.${key}, $field);
-#elseif ($property.isMethodBinding())
-        if ($field != null)
-            bean.setProperty(${component.className}.${key}, new MethodExpressionMethodBinding($field))
-#elseif ($property.isLiteralOnly())
-        bean.setProperty(${component.className}.${key}, $field);
-#elseif ($type == "String[]")
-        setStringArrayProperty(bean, ${component.className}.${key}, $field);
-#else
-        setProperty(bean, ${component.className}.${key}, $field);
-#end
-#end
-    }
-    
-    public void release()
-    {
-        super.release();
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($empty = "null")
-        $field = $empty;
-#end
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/validatorClass11.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/validatorClass11.vm
deleted file mode 100644
index a5e2a1a..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/validatorClass11.vm
+++ /dev/null
@@ -1,222 +0,0 @@
-## Velocity template used to generate JSF1.1-compatible validator classes
-## from validator meta-data.
-##
-## Note that there are only one type of validator generation:
-##  * "subclass mode" (use annotated class as a parent class)
-##
-## Variable $validator refers to a ValidatorMeta object to process
-## Variable $utils refers to an instance of MyfacesUtils.
-##
-## When "template mode" is being used then variable $innersource
-## holds a String containing all the non-abstract functions defined
-## in the annotated class.
-##
-## The java package of the generated class is always the same as
-## the package in which the annotated class exists.
-##
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- * 
- *  http://www.apache.org/licenses/LICENSE-2.0
- * 
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package ${validator.packageName};
-
-import javax.faces.el.ValueBinding;
-import javax.faces.context.FacesContext;
-$utils.importTagClasses($validator)
-
-#if ($validator.isTemplate())
-#set ($generatedClassParent = $validator.sourceClassParentClassName)
-#else
-#set ($generatedClassParent = $validator.sourceClassName)
-#end
-// Generated from class ${validator.sourceClassName}.
-//
-// WARNING: This file was automatically generated. Do not edit it directly,
-//          or you will lose your changes.
-public class ${utils.getClassFromFullClass($validator.className)} extends $generatedClassParent
-#if ($validator.implements)
-    implements $validator.implements
-#end
-{
-
-#if ($validator.validatorId)
-    static public final String VALIDATOR_ID = 
-        "$validator.validatorId";
-#end
-
-    public ${utils.getClassFromFullClass($validator.className)}()
-    {
-    }
-    
-#set ($propertyList = ${validator.propertyValidatorList})
-
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($type = $utils.getClassFromFullClass($property.className))
-#if($utils.getDefaultValueField($property)) 
-#set ($defaultValue = $utils.getDefaultValueField($property))
-#else
-#set ($defaultValue = false)
-#end
-    // Property: $property.name
-#if ($property.isLiteralOnly() || $property.isTagExcluded() )
-    private $type $field #if($defaultValue) = $defaultValue;#{else};#{end}
-
-     
-#else
-    private $type $field;
-    
-#end
-#if($utils.isPrimitiveClass($type) && !$property.isTagExcluded() )
-    private boolean ${field}Set;
-    
-#if ($property.isSetMethod())
-    $property.setMethodScope boolean $utils.getPrefixedPropertyName("isSet", $property.name)()
-    {
-        return ${field}Set;
-    }
-#end
-#end
-#if($property.isLocalMethod())
-#if("boolean" == $type)
-#set ($methodName = $utils.getPrefixedPropertyName("isLocal", $property.name))
-#else
-#set ($methodName = $utils.getPrefixedPropertyName("getLocal", $property.name))
-#end
-    final $property.localMethodScope $type ${methodName}()
-    {
-        return $field;
-    }
-     
-#end
-    public $type $utils.getMethodReaderFromProperty($property.name, $type)()
-    {
-#if ($property.isTagExcluded() || $property.isLiteralOnly())
-        return $field;
-#else
-#if ($utils.isPrimitiveClass($type))
-        if (${field}Set)
-#else
-        if ($field != null)
-#end
-        {
-            return $field;
-        }
-        ValueBinding vb = getValueBinding("$property.name");
-        if (vb != null)
-        {
-#if ($utils.isPrimitiveClass($type))
-            return ($utils.castIfNecessary($type) vb.getValue(getFacesContext())).${type}Value();
-#else
-#set ($pritype = $utils.getPrimitiveType($property.className))
-#if ($utils.isPrimitiveClass($pritype))
-            Object value = vb == null ? null : vb.getValue(getFacesContext());
-            if (!(value instanceof $type)){
-                value = ${type}.valueOf(value.toString());
-            }            
-            return $utils.castIfNecessary($type) value;
-#else
-            return $utils.castIfNecessary($type) vb.getValue(getFacesContext());
-#end
-#end
-        }
-#if ($defaultValue)
-        return $defaultValue; 
-#elseif ($utils.isPrimitiveClass($type))
-        return $utils.primitiveDefaultValue($type);
-#else       
-        return null;
-#end
-#end
-    }
-
-    public void $utils.getPrefixedPropertyName("set", $property.name)($type $utils.getVariableFromName($property.name))
-    {
-        this.$field = $utils.getVariableFromName($property.name);
-#if ($utils.isPrimitiveClass($type) && !$property.isTagExcluded() )
-        this.${field}Set = true;        
-#end
-    }
-#end
-
-    public Object saveState(FacesContext facesContext)
-    {
-#set ($primitiveCount = $propertyList.size() + 1)
-#foreach( $property in $propertyList )
-#if($utils.isPrimitiveClass($property.className))
-#set ($primitiveCount = $primitiveCount + 1)
-#end
-#end
-        Object[] values = new Object[$primitiveCount];
-        values[0] = super.saveState(facesContext);
-#set ($arrayIndex = 0)
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($type = $property.className)
-#set ($arrayIndex = $arrayIndex + 1)
-#if ($property.jspName == "validator" && $property.isMethodBinding() )
-        values[$arrayIndex] = saveAttachedState(facesContext,${field}List);
-#elseif ( $property.isStateHolder() )## || $utils.isConverter($type)
-        values[$arrayIndex] = saveAttachedState(facesContext,$field);
-#elseif($utils.isPrimitiveClass($type))
-#if ($type == "boolean")
-        values[$arrayIndex] = ${utils.getBoxedClass($type)}.valueOf($field);
-#else
-        values[$arrayIndex] = new ${utils.getBoxedClass($type)}($field);
-#end
-#else
-        values[$arrayIndex] = $field;
-#end
-#if($utils.isPrimitiveClass($type) && !$property.isTagExcluded())
-#set ($arrayIndex = $arrayIndex + 1)
-        values[$arrayIndex] = Boolean.valueOf(${field}Set);
-#end
-#end
-        return values; 
-    }
-
-    public void restoreState(FacesContext facesContext, Object state)
-    {
-        Object[] values = (Object[])state;
-        super.restoreState(facesContext,values[0]);
-#set ($arrayIndex = 0)
-#foreach( $property in $propertyList )
-#set ($field = $property.fieldName)
-#set ($type = $property.className)
-#set ($arrayIndex = $arrayIndex + 1)
-#if ( $property.isStateHolder() )
-#if ($property.jspName == "validator" && $property.isMethodBinding() )
-        ${field}List = (List<Validator>) restoreAttachedState(facesContext,values[$arrayIndex]);
-#elseif ($utils.isList($type))
-        $field = (List) restoreAttachedState(facesContext,values[$arrayIndex]);
-#else
-        $field = $utils.castIfNecessary($type) restoreAttachedState(facesContext,values[$arrayIndex]); 
-#end
-#elseif ($utils.isConverter($type)) 
-        $field = (Converter) restoreAttachedState(facesContext,values[$arrayIndex]);
-#elseif ($utils.isPrimitiveClass($type))
-        $field = ($utils.castIfNecessary($type) values[$arrayIndex]).${type}Value();
-#else
-        $field = $utils.castIfNecessary($type) values[$arrayIndex];
-#end
-#if($utils.isPrimitiveClass($type) && !$property.isTagExcluded() )
-#set ($arrayIndex = $arrayIndex + 1)
-        ${field}Set = ((Boolean) values[$arrayIndex]).booleanValue();
-#end
-#end
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/validatorClassMacros11.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/validatorClassMacros11.vm
deleted file mode 100644
index 8362de7..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/validatorClassMacros11.vm
+++ /dev/null
@@ -1,4 +0,0 @@
-## Macro definitions for component class definition
-##
-## Velocity macros defined in this file will be available when executing
-## the componentClass11.vm template file.
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/xdoc-component.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/xdoc-component.vm
deleted file mode 100644
index 33d6ca7..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/xdoc-component.vm
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<document>
- <properties>
-  <title>&lt;${component.name}&gt;</title>
- </properties>
- <body>
-  <section name="Summary">
-  <p>
-   <b>Tag name:</b> &lt;${component.name}&gt;
-   <br/>
-#set ($javadocPath = "../apidocs/" + $component.getClassName().replace('.', '/') )
-   <b>UIComponent class:</b> <a href="${tagdocUtils.platformAgnosticPath( $javadocPath )}.html">${component.className}</a>
-   <br/>
-#if ($component.tagClass)
-#set ($javadocPath = "../apidocs/" + $component.getTagClass().replace('.', '/') )
-   <b>Tag class:</b> <a href="${tagdocUtils.platformAgnosticPath( $javadocPath )}.html">${component.tagClass}</a>
-   <br/>
-#end
-   <b>Component type:</b> ${component.type}
-   <br/>
-   <b>Component family:</b> ${component.family}
-   <br/>
-#if (${component.rendererType})
-   <b>Renderer type:</b> ${component.rendererType}
-   <br/>
-#set ($rendererClasses = $tagdocUtils.getRendererClasses($component,$model).values() )
-#foreach ($rendererClass in $rendererClasses)
-#set ($javadocPath = "../apidocs/" + $rendererClass.replace('.', '/') )
-   <b>Renderer class:</b> <a href="${tagdocUtils.platformAgnosticPath( $javadocPath )}.html">${rendererClass}</a>
-   <br/>
-#end
-#end
-   <br/>      
-${component.longDescription}   
-  </p>
-  </section>
-#if ($baseContent)
-$baseContent
-#end
-#set($facetList = ${tagdocUtils.getSortedFacetList($component)})
-#if ($facetList.size() != 0)
-  <section name="Supported Facets">
-   <p>
-   <table>
-    <tr>
-     <th>Name</th>
-     <th>Required</th>
-     <th>Description</th>
-    </tr>
-#foreach( $facet in $facetList )
-    <tr>
-     <td>$facet.name</td>
-     <td>$facet.isRequired()</td>
-#if ($facet.longDescription)
-     <td>$facet.longDescription</td>
-#else
-     <td></td>
-#end     
-    </tr>
-#end
-   </table>
-   </p>
-  </section>
-#end  
-#set ($propertyList = ${tagdocUtils.getSortedPropertyList($component)})
-#if ($propertyList.size() != 0)  
-  <section name="Attributes">
-<table>
- <tr>
-  <th>Name</th>
-  <th>Type</th>
-  <th>Supports EL?</th>
-  <th>Description</th>
- </tr>
-#foreach( $property in $propertyList )
-#if (!$property.isTagExcluded())
- <tr>
-  <td>$property.jspName</td>
-#set ($type = ${tagdocUtils.getDisplayType($component.className,$property.jspName,$property.className)})
-  <td>$type</td>
-#if ($property.jspName == "action")
-  <td>Yes</td>
-#elseif ($property.isMethodBinding() || $property.isMethodExpression())
-  <td>Only EL</td>
-#elseif ($property.jspName == "binding")
-  <td>Only EL</td>
-#elseif ($property.isLiteralOnly())
-  <td>No</td>
-#else
-  <td>Yes</td>
-#end
-#if ($property.longDescription)
-  <td>$property.longDescription</td>
-#else
-  <td></td>
-#end
- </tr>
-#end
-#end
-</table>
-#end
-  </section>
- </body> 
-</document>
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/xdoc-converter.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/xdoc-converter.vm
deleted file mode 100644
index 5e9ebd6..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/xdoc-converter.vm
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<document>
- <properties>
-  <title>&lt;${converter.name}&gt;</title>
- </properties>
- <body>
-  <section name="Summary">
-  <p>
-   <b>Tag name:</b> &lt;${converter.name}&gt;
-   <br/>
-#set ($javadocPath = "../apidocs/" + $converter.getClassName().replace('.', '/') )
-   <b>Converter class:</b> <a href="${tagdocUtils.platformAgnosticPath( $javadocPath )}.html">${converter.className}</a>
-   <br/>
-#if ($converter.tagClass)
-#set ($javadocPath = "../apidocs/" + $converter.getTagClass().replace('.', '/') )
-   <b>Tag class:</b> <a href="${tagdocUtils.platformAgnosticPath( $javadocPath )}.html">${converter.tagClass}</a>
-   <br/>
-#end
-   <b>converter id:</b> ${converter.converterId}
-   <br/>
-${converter.longDescription}   
-  </p>
-  </section>
-#if ($baseContent)
-$baseContent
-#end
-#set ($propertyList = ${tagdocUtils.getSortedPropertyList($converter)})
-#if ($propertyList.size() != 0)  
-  <section name="Attributes">
-<table>
- <tr>
-  <th>Name</th>
-  <th>Type</th>
-  <th>Supports EL?</th>
-  <th>Description</th>
- </tr>
-#foreach( $property in $propertyList )
-#if (!$property.isTagExcluded())
- <tr>
-  <td>$property.jspName</td>
-#set ($type = ${tagdocUtils.getDisplayType($converter.className,$property.jspName,$property.className)})
-  <td>$type</td>
-#if ($property.jspName == "action")
-  <td>Yes</td>
-#elseif ($property.isMethodBinding() || $property.isMethodExpression())
-  <td>Only EL</td>
-#elseif ($property.jspName == "binding")
-  <td>Only EL</td>
-#elseif ($property.isLiteralOnly())
-  <td>No</td>
-#else
-  <td>Yes</td>
-#end
-#if ($property.longDescription)
-  <td>$property.longDescription</td>
-#else
-  <td></td>
-#end
- </tr>
-#end
-#end
-</table>
-#end
-  </section>
- </body> 
-</document>
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/xdoc-tag.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/xdoc-tag.vm
deleted file mode 100644
index 65e42cf..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/xdoc-tag.vm
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<document>
- <properties>
-  <title>&lt;${tag.name}&gt;</title>
- </properties>
- <body>
-  <section name="Summary">
-  <p>
-   <b>Tag name:</b> &lt;${tag.name}&gt;
-   <br/>
-#set ($javadocPath = "../apidocs/" + $tag.getClassName().replace('.', '/') )
-   <b>Tag class:</b> <a href="${tagdocUtils.platformAgnosticPath( $javadocPath )}.html">${tag.className}</a>
-   <br/>
-${tag.longDescription}   
-  </p>
-  </section>
-#if ($baseContent)
-$baseContent
-#end
-#set ($attributeList = ${tagdocUtils.getSortedAttributeList($tag)})
-#if ($attributeList.size() != 0)  
-  <section name="Attributes">
-<table>
- <tr>
-  <th>Name</th>
-  <th>Type</th>
-  <th>Required</th>
-  <th>Description</th>
- </tr>
-#foreach( $attribute in $attributeList )
-#if (!$attribute.isTagExcluded())
- <tr>
-  <td>$attribute.name</td>
-#set ($type = ${tagdocUtils.getDisplayType($tag.className,$attribute.name,$attribute.className)})
-  <td>$type</td>
-  <td>$attribute.isRequired()</td>
-#if ($attribute.longDescription)
-  <td>$attribute.longDescription</td>
-#else
-  <td></td>
-#end
- </tr>
-#end
-#end
-</table>
-#end
-  </section>
- </body> 
-</document>
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/xdoc-validator.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/xdoc-validator.vm
deleted file mode 100644
index fbf928b..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/xdoc-validator.vm
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<document>
- <properties>
-  <title>&lt;${validator.name}&gt;</title>
- </properties>
- <body>
-  <section name="Summary">
-  <p>
-   <b>Tag name:</b> &lt;${validator.name}&gt;
-   <br/>
-#set ($javadocPath = "../apidocs/" + $validator.getClassName().replace('.', '/') )
-   <b>Validator class:</b> <a href="${tagdocUtils.platformAgnosticPath( $javadocPath )}.html">${validator.className}</a>
-   <br/>
-#if ($validator.tagClass)
-#set ($javadocPath = "../apidocs/" + $validator.getTagClass().replace('.', '/') )
-   <b>Tag class:</b> <a href="${tagdocUtils.platformAgnosticPath( $javadocPath )}.html">${validator.tagClass}</a>
-   <br/>
-#end
-   <b>validator id:</b> ${validator.validatorId}
-   <br/>
-${validator.longDescription}   
-  </p>
-  </section>
-#if ($baseContent)
-$baseContent
-#end
-#set ($propertyList = ${tagdocUtils.getSortedPropertyList($validator)})
-#if ($propertyList.size() != 0)  
-  <section name="Attributes">
-<table>
- <tr>
-  <th>Name</th>
-  <th>Type</th>
-  <th>Supports EL?</th>
-  <th>Description</th>
- </tr>
-#foreach( $property in $propertyList )
-#if (!$property.isTagExcluded())
- <tr>
-  <td>$property.jspName</td>
-#set ($type = ${tagdocUtils.getDisplayType($validator.className,$property.jspName,$property.className)})
-  <td>$type</td>
-#if ($property.jspName == "action")
-  <td>Yes</td>
-#elseif ($property.isMethodBinding() || $property.isMethodExpression())
-  <td>Only EL</td>
-#elseif ($property.jspName == "binding")
-  <td>Only EL</td>
-#elseif ($property.isLiteralOnly())
-  <td>No</td>
-#else
-  <td>Yes</td>
-#end
-#if ($property.longDescription)
-  <td>$property.longDescription</td>
-#else
-  <td></td>
-#end
- </tr>
-#end
-#end
-</table>
-#end
-  </section>
- </body> 
-</document>
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/xmlMacros.vm b/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/xmlMacros.vm
deleted file mode 100644
index e69de29..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/main/resources/META-INF/xmlMacros.vm
+++ /dev/null
diff --git a/maven2-plugins/myfaces-builder-plugin/src/site/apt/attributes.apt b/maven2-plugins/myfaces-builder-plugin/src/site/apt/attributes.apt
deleted file mode 100644
index fe5b9a7..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/site/apt/attributes.apt
+++ /dev/null
@@ -1,124 +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.
- 
- ------
- Attributes
- ------
- 
-Attributes
- 
-    Tags has attributes. Attribute behavior is different from a property,
-    so it is necessary to use a different annotation/doclet to use it.
-    Usually tags are written by users, but has few attributes and does not
-    have a complex hierarchy, so it is not necessary make tags inherit
-    attributes from other tags.
-    
-    The objective of use @JSFJspTag and @JSFJspAttribute annotation/doclet is
-    make easier keep synchronized the .tld file with the tag class.
-    
-* Attribute loaded from basic type
-
-    On jsf 1.1 and in some special cases, no ValueExpressions are allowed
-    on some attribute.
-
--------------------
-    /** 
-      * On tlds this is translated to something like:
-      *
-      * <attribute>
-      *    <description><![CDATA[Some description]]></description>
-      *    <name>var</name>
-      *    <required>false</required>
-      *    <rtexprvalue>false</rtexprvalue>
-      *    <type>java.lang.String</type>
-      * </attribute>
-      *
-      */
-    @JSFJspAttribute
-    public void setVar(String var)
-    {
-        // .... some code ....
-    }
--------------------
-
-* Attribute loaded from ValueExpression
-
-    There are two cases 
-
--------------------
-
-    /** 
-      * On jsf 1.1 this translates to something like:
-      *
-      * Works on version 1.0.2, but some jsf 1.2 tld templates translate it to:
-      * 
-      * <attribute>
-      *    <description><![CDATA[The fully qualified class name of the ActionListener class.]]></description>
-      *    <name>type</name>
-      *    <required>false</required>
-      *    <deferred-value>
-      *        <type>java.lang.String</type>
-      *    </deferred-value>
-      * </attribute>      
-      *  
-      * On version 1.0.3 this should be translated to something like:
-      * 
-      * <attribute>
-      *    <description><![CDATA[The fully qualified class name of the ActionListener class.]]></description>
-      *    <name>type</name>
-      *    <required>false</required>
-      *    <rtexprvalue>true</rtexprvalue>
-      * </attribute>
-      * 
-      * But this depends on the template used to generate its tld.
-      **/
-    @JSFJspAttribute(className = "java.lang.String", rtexprvalue = true)
-    public void setType(ValueExpression type)
-    {
-        // .... some code ....
-    }
-    
-    /**
-      * Works on version 1.0.3 and upper for jsf 1.2 and upper tld templates:
-      *
-      * <attribute>
-      *    <description><![CDATA[The fully qualified class name of the ActionListener class.]]></description>
-      *    <name>type</name>
-      *    <required>false</required>
-      *    <deferred-value>
-      *        <type>java.lang.String</type>
-      *    </deferred-value>
-      * </attribute>  
-      **/
-    @JSFJspAttribute(deferredValueType = "java.lang.String")
-    public void setType(ValueExpression type)
-    {
-        // .... some code ....
-    }
-    
-    
--------------------
-
-* Attribute loaded from MethodExpression
-
--------------------
-  /** works on version 1.0.3 and upper for jsf 1.2 and upper tld templates **/
-  @JSFJspAttribute(required=true,
-          deferredMethodSignature = "void myMethod(javax.faces.context.FacesContext, java.io.OutputStream)")
-  public void setMethod(MethodExpression method)
-  {
-    _method = method;
-  }
--------------------
diff --git a/maven2-plugins/myfaces-builder-plugin/src/site/apt/components.apt b/maven2-plugins/myfaces-builder-plugin/src/site/apt/components.apt
deleted file mode 100644
index 845d019..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/site/apt/components.apt
+++ /dev/null
@@ -1,240 +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.
- 
- ------
- Creating Custom Components 
- ------
- 
-Creating Custom Components
- 
-    Any JSF Component has the following elements:
-    
-     * Component class file(s).
-    
-     * JSP tag class file(s).
-    
-     * Entry on faces-config.xml.
-    
-     * Renderer class file(s) (optional).
-    
-     * TLD file (optional).
-    
-     * facelet-taglib entry (optional).
-    
-     * Facelets tag handler files (optional).
-    
-    Keep all those files up to date is a complex task, but with 
-    myfaces-builder-plugin you just need to take care about:
-    
-     * Component class file(s).
-    
-     * Renderer class file(s) (optional).
-    
-     * Facelets tag handler files (optional).
-    
-    This example shows step by step what do you need to create a custom
-    component.
-    
-Setting up your project
-
-    All information related can be found {{{setup.html}here}}.
-
-Configuration files (faces-config.xml, .tld, facelets taglib)
-
-    This {{{config-files.html}page}} shows some examples.
-
-Writing your component class
-
-    There are three possibilities for create a component class:
-    
-    * Write just one file and add all code manually (Example: t:aliasBean).
-    
-    * Write an abstract class, and let generate all property code, including
-      saveState/restoreState methods in a concrete child class 
-      (Example: almost all components in tomahawk core and sandbox).
-    
-    * Write an abstract class (generally package scope) and use template
-      pattern. In other words, all property code is generated including
-      saveState/restoreState methods in a concrete child class, but other
-      code inside the abstract class is copied to the generated class.
-
-* Write a component class manually
-
-    In this mode, no code is generated, but the information is chained to
-    other files to be generated like faces-config.xml, tlds, tag classes, etc.
-    
-    Below there is an example of it:
-    
--------------------
-/**
- * The most important points are: 
- * 
- * 1. Define componentType, componentFamily and rendererType adding its
- * constants (like below) or directly in the annotation.
- * 
- * 2. If the component has a jsp tag, define the "name" and the "tagClass"
- * If the tagClass does not exists a new file is generated if make-tags
- * goal is set on pom.xml
- * 
- */
-@JSFComponent(
-   name = "mycomponents:sayHello",
-   clazz = "org.myorganization.component.sayhello.SayHello",
-   tagClass = "org.myorganization.component.sayhello.SayHelloTag")
-public class SayHello extends UIOutput
-{
-    public static final String COMPONENT_TYPE = "org.myorganization.SayHello";
-    public static final String DEFAULT_RENDERER_TYPE = "org.myorganization.SayHelloRenderer";
-    public static final String COMPONENT_FAMILY = "javax.faces.Output";
-
-    /** ..... Some custom code goes here .... **/
-}
--------------------
-
-* Write a component class using Abstract Pattern
-
-    The objective is create a abstract component class 
-    that defines all information required to generate the concrete 
-    component class. All custom code goes in the abstract class, so it
-    is inherited to the child component.
-    
-    This pattern is preferred over template mode, because it is more simple
-    to understand, but there are some cases where this mode cannot be
-    applied (like in myfaces core api, where the component hierarchy cannot
-    be changed).
-    
-    Below there is an example of it:
-
--------------------
-/**
- * To generate component classes using abstract pattern
- * 
- * 1. Define the "clazz" file which it is generated
- * 
- * 2. Define componentType, componentFamily and rendererType adding its
- * constants (like below) or directly in the annotation.
- * 
- * 3. If the component has a jsp tag, define the "name" and the "tagClass"
- * If the tagClass does not exists a new file is generated if make-tags
- * goal is set on pom.xml
- * 
- */
-@JSFComponent(
-   name = "mycomponents:sayHello",
-   clazz = "org.myorganization.component.sayhello.SayHello",
-   tagClass = "org.myorganization.component.sayhello.SayHelloTag")
-public abstract class AbstractSayHello extends UIOutput
-{
-    public static final String COMPONENT_TYPE = "org.myorganization.SayHello";
-    public static final String DEFAULT_RENDERER_TYPE = "org.myorganization.SayHelloRenderer";
-    public static final String COMPONENT_FAMILY = "javax.faces.Output";
-
-    /**
-     * User's first name.
-     */
-    @JSFProperty
-    public abstract String getName();
-}
--------------------
-
-* Write a component class using Template Pattern
-
-    The objective is create an abstract (generally package scoped) class
-    that works as a "template".
-    
--------------------
-@JSFComponent(
-   name = "mycomponents:sayHello",
-   clazz = "org.myorganization.component.sayhello.SayHello",
-   tagClass = "org.myorganization.component.sayhello.SayHelloTag")
-abstract class _SayHello extends UIOutput
-{
-    public static final String COMPONENT_TYPE = "org.myorganization.SayHello";
-    public static final String DEFAULT_RENDERER_TYPE = "org.myorganization.SayHelloRenderer";
-    public static final String COMPONENT_FAMILY = "javax.faces.Output";
-
-    /**
-     * This method is copied to generated SayHello class
-     **/
-    public void broadcast(javax.faces.event.FacesEvent event)
-        throws javax.faces.event.AbortProcessingException
-    {
-        //Some custom code goes here
-    }
-    
-    /**
-     * This method is not copied, but @JSFExclude works with fields too!
-     **/
-    @JSFExclude
-    public void doSomething()
-    {
-        //Some never used custom code goes here
-    }
-    
-    /**
-     * User's first name.
-     */
-    @JSFProperty
-    public abstract String getName();
-}
--------------------
-
-Generating Component Tag Classes
-
-    The goal "make-tags" trigger component jsp tag generation. This goal
-    checks if the tag class exists and if not, it creates one.
-
-    Here there are two scenarios:
-    
-     * The component class inherits from jsf core UIXXXXX, so the generated 
-       class inherits from javax.faces.webapp.UIComponent(EL)Tag.
-     
-     * The component class inherits from jsf core HtmlXXX. In this case, 
-       the tag classes where your component inherits is on myfaces core 
-       impl jar, so again there are three options:
-       
-        * Add myfaces core impl jar as compile dependency and use myfaces
-          core in your web application. 
-        
-        * Add tomahawk core or core12 to your dependencies, where there 
-          is an alternate tag hierarchy, so your components can work 
-          with the reference implementation. Make sure tomahawk dependency.
-          should be before myfaces core dependency in the pom, to be sure
-          that tomahawk model is loaded first.
-          
-        * Generate a jsf html tag hierarchy in your jar. See tomahawk core
-          or core12 pom for details.
-    
-    If you need to write some custom code on tag class, but keep some
-    code generated, use abstract pattern on tag class. The properties that
-    needs to be defined on abstract tag class must have inheritedTag="true",
-    so there are not overriden. See t:tree component for an example.  
-        
-Adding a Renderer to faces-config.xml file.
-
-    The annotations/doclets @JSFRenderer and @JSFRenderKit are used include
-    renderer configuration to generated faces-config.xml files. Just add it
-    to your renderer like this: 
-    
----------------------------
-@JSFRenderer(
-   renderKitId = "HTML_BASIC",
-   family = "javax.faces.Output",
-   type = "org.myorganization.SayHelloRenderer")
-public class SayHelloRenderer extends Renderer
-{
-    //Some code goes here
-}
----------------------------
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/site/apt/config-files.apt b/maven2-plugins/myfaces-builder-plugin/src/site/apt/config-files.apt
deleted file mode 100644
index 9e537d7..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/site/apt/config-files.apt
+++ /dev/null
@@ -1,84 +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.
-
- ------
- Configuration files 
- ------
-
-Configuration files (faces-config.xml, .tld, facelets taglib)
-
-    All configuration files are generated by 
-    {{{make-config-mojo.html}make-config}} goal.
-    
-    This goal can be seen as an equation:
-
--------------------------
-     xmlBaseFile + templateFile( model(s) to take in consideration ) = xmlFile
--------------------------
-    
-    It is enought flexible to generate any file based on the model.
-    Some examples can be seen below.
-    
--------------------------
-          ............ plugin declaration goes before ...........
-          <!-- faces-config -->
-          <execution>
-            <id>makefacesconfig</id>
-            <configuration>
-                <templateFile>faces-config12.vm</templateFile>
-                <xmlFile>META-INF/faces-config.xml</xmlFile>
-            </configuration>
-            <goals>
-                <goal>make-config</goal>
-            </goals>
-          </execution>
-          
-          <!-- tld -->
-          <execution>
-            <id>maketomahawktld</id>
-            <configuration>
-                <xmlFile>META-INF/tomahawk.tld</xmlFile>
-                <xmlBaseFile>src/main/conf/META-INF/tomahawk-base.tld</xmlBaseFile>
-                <templateFile>tomahawk12.vm</templateFile>
-                <params>
-                   <shortname>t</shortname>
-                   <uri>http://myfaces.apache.org/tomahawk</uri>
-                   <displayname>Tomahawk tag library 1.2.</displayname>
-                </params>
-            </configuration>
-            <goals>
-                <goal>make-config</goal>
-            </goals>
-          </execution>
-          
-          <!-- facelets taglib -->        
-          <execution>
-            <id>maketomahawktaglib</id>
-            <configuration>
-                <xmlFile>META-INF/tomahawk.taglib.xml</xmlFile>
-                <xmlBaseFile>src/main/conf/META-INF/facelets-taglib-base.xml</xmlBaseFile>
-                <templateFile>facelets-taglib.vm</templateFile>
-                <params>
-                   <shortname>t</shortname>
-                   <uri>http://myfaces.apache.org/tomahawk</uri>
-                </params>
-            </configuration>
-            <goals>
-                <goal>make-config</goal>
-            </goals>
-          </execution>
-          .................
--------------------------
-
diff --git a/maven2-plugins/myfaces-builder-plugin/src/site/apt/converters.apt b/maven2-plugins/myfaces-builder-plugin/src/site/apt/converters.apt
deleted file mode 100644
index 4c3761a..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/site/apt/converters.apt
+++ /dev/null
@@ -1,75 +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.
- 
- ------
- Creating Custom Converters 
- ------
- 
-Creating Custom Converters
- 
-    A JSF Converter needs the following elements:
-    
-     * A class implementing converter interface.
-     
-     * Entry on faces-config.xml.
-     
-     * Tag entry on tld.
-     
-     * Tag entry on facelets taglib (optional).
-     
-     * JSP Tag class
-     
-    Myfaces builder plugin provide annotations/doclets to help users maintain
-    configuration files, and generating converter jsp tag classes 
-    automatically. In this way, all information for a converter is just in
-    one file (the class implementing Converter interface).
-    
-    On jsf 1.2, it is necessary to provide a base tag class that extends
-    from javax.faces.webapp.ConverterELTag where all converters should 
-    inherit. This class is on myfaces commons converters project, but 
-    users can provide custom template implementations for it.
-
-Setting up your project
-
-    All information related can be found {{{setup.html}here}}.
-
-Configuration files (faces-config.xml, .tld, facelets taglib)
-
-    This {{{config-files.html}page}} shows some examples.
-    
-Annotate Converter Classes
-
-    Just add the annotations/doclets as presented below:
-
--------------------
-
-@JSFConverter(
-    name = "mcc:convertDateTime",
-    tagClass = "org.apache.myfaces.commons.converter.ConvertDateTimeTag",
-    tagSuperclass = "org.apache.myfaces.commons.converter.ConverterTag")
-public class DateTimeConverter extends javax.faces.convert.DateTimeConverter
-{
-    public static final String CONVERTER_ID = "org.apache.myfaces.custom.convertDateTime.DateTimeConverter";
- 
-    /** .......... impl code goes here ......... **/
-    
-    @JSFProperty
-    public String getProperty()
-    {
-        // some stuff
-    }   
-}
--------------------
-    
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/site/apt/doclets-annotations.apt b/maven2-plugins/myfaces-builder-plugin/src/site/apt/doclets-annotations.apt
deleted file mode 100644
index 880fd96..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/site/apt/doclets-annotations.apt
+++ /dev/null
@@ -1,70 +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.
- 
- ------
- Doclets and Annotations 
- ------
- 
-Doclets and Annotations
-
-    To annotate the necessary information in 
-    component / converter / validator / renderkit / renderer / tag files
-    you can use doclets:
-    
--------------------
-
-    /**
-     * This is a doclet
-     *
-     * @JSFProperty
-     *       required = "true"
-     *       defaultValue = "AnyValue"
-     **/
-    
--------------------
-
-    or annotations
-    
--------------------
-
-    /**
-     * This is an annotation
-     *
-     **/
-     @JSFProperty(
-          required = true,
-          defaultValue = "AnyValue")
-
--------------------
-    
-    Doclets and annotations can be used on both jsf 1.1 and jsf 1.2, but
-    since jsf 1.1 is jdk 1.4 compatible, it is preferred to use doclets with
-    jsf 1.1 (note that if you use annotations, your source code should be
-    jdk 1.5 in order to compile).
-    
-    The differences between doclets and annotations are listed below:
-    
-     * Attribute names like "class", "implements" in annotated
-       version are "clazz" and "implementz".
-      
-     * All attribute values in doclets must be between "". In annotations
-       boolean attributes must not (see "required" example below).
-      
-     * Usage of annotations like @JSFJspProperties and @JSFRenderers are
-       not required on doclets.
-    
-    Taking into account the previous differences, you can consult the
-    annotation javadoc for doclets.
-    
diff --git a/maven2-plugins/myfaces-builder-plugin/src/site/apt/howto.apt b/maven2-plugins/myfaces-builder-plugin/src/site/apt/howto.apt
deleted file mode 100644
index ef80273..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/site/apt/howto.apt
+++ /dev/null
@@ -1,100 +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.
-
- ------
- How to Use 
- ------
-
-Scan annotations/doclets and generate metadata
-
-  Just add this code to your project pom.xml
-  
--------------------
-<project>
-   ...
-      <build>
-         ...
-        <plugins>
-            <plugin>
-                <groupId>org.apache.myfaces.buildtools</groupId>
-                <artifactId>myfaces-builder-plugin</artifactId>
-                <version>1.0.2<version>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>build-metadata</goal>
-                        </goals>
-                    </execution>
-                </executions>
-             </plugin>
-         </plugins>
-         ...
-      </build>
-   ...
-</project>
--------------------
-
-    This goal scans all source classes for annotations or doclets and other metadata
-    files inside the project dependences and build the metadata file 
-    (META-INF/myfaces-metadata.xml), required by other goals to work.
-
-Archetype using myfaces-builder-plugin
-
-    The latest myfaces-archetype-jsfcomponents available {{{http://svn.apache.org/repos/asf/myfaces/myfaces-build-tools/trunk/maven2-archetypes/myfaces-archetype-jsfcomponents/}here}}
-    or with version 1.0.2 or upper uses myfaces-builder-plugin to generate component classes,
-    tag classes, config files, etc. Just checkout the code, compile it and look the instructions on 
-    {{{http://wiki.apache.org/myfaces/MyFaces_Archetypes_for_Maven}Myfaces Archetypes for Maven}}.
-
-Generate custom components
-
-    The code below shows how to configure the plugin to generate metadata
-    and then use it to generate component classes.
-
--------------------
-<project>
-   ...
-      <build>
-         ...
-        <plugins>
-            <plugin>
-                <groupId>org.apache.myfaces.buildtools</groupId>
-                <artifactId>myfaces-builder-plugin</artifactId>
-                <version>1.0.2<version>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>build-metadata</goal>
-                        </goals>
-                    </execution>
-                    <execution>
-                        <id>makecomp</id>
-                        <goals>
-                            <goal>make-components</goal>
-                        </goals>
-                        <configuration>
-                            <jsfVersion>12</jsfVersion>
-                            <templateComponentName>myComponentTemplateClass.vm</templateComponentName>
-                        </configuration>
-                    </execution>
-                </executions>
-             </plugin>
-         </plugins>
-         ...
-      </build>
-   ...
-</project>
--------------------
-
-    Take a look at user guide section to see more detailed information.
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/site/apt/index.apt b/maven2-plugins/myfaces-builder-plugin/src/site/apt/index.apt
deleted file mode 100644
index c7fe610..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/site/apt/index.apt
+++ /dev/null
@@ -1,167 +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.
-
- ------
- Myfaces Builder Plugin 
- ------
- 
-Summary
-
-  This is a maven plugin that uses javadoc annotations to generate the necessary JSF configuration
-  files (.tld, faces-config.xml, etc) and optionally Tag, Validator and Component classes.
-
-  See the documentation menu in the left-hand navigation pane for more information.
-
-Introduction
-
-  A JSF component library needs to provide hand-written:
-
-  * component classes
-  
-  * renderer classes
-
-  * converter and validator classes
-    
-  []
-
-  It then needs to also provide:
-
-  * jsp taglib files
-
-  * facelets taglib files
-
-  * tag classes
-  
-  []
-
-  However in most cases, the second category of artifacts can be generated from the
-  first ones. Tag classes generally just copy data from one format to another and
-  do not have any custom logic; they can effectively be created using code templates.
-  The config files are mostly just a "summary" of the information in the hand-written
-  classes above, and so are also a candidate for generation.
-
-  In addition, components have a lot of getter/setter methods for properties, where the
-  getter/setter implementations are very repetitive. Components also need to provide
-  state-handling methods (saveState/restoreState) which are also repetitive. In both
-  cases, the necessary methods can potentially be generated given metadata about the
-  properties belonging to a component. 
-  
-Requirements
-
-  * Minimise the amount of code duplication, ie where a single change requires changes
-    in two different places
-
-  * Minimise bugs due to inconsistencies between data that should match.
-  
-  * Reduce the boredom factor
-  
-  * Allow optimisations in handling of JSF classes (eg state-saving improvements) to
-    be implemented in just one place, rather than having to repeat the same fix in
-    every place that uses the same boilerplate code.
-    
-  * Keep the code simple to understand for people new to MyFaces. A solution that will
-    discourage people from committing patches to myfaces code is worse than no solution.
-
-  * Don't make building the code more complicated.
-
-  * Don't make debugging of the code more complicated
-
-  * Provide a solution that can be applied to as many myfaces projects as possible;
-    a separate build tool per project is not desirable. Note, however, that each
-    project must "opt in", so any successful tool must satisfy the needs of multiple
-    projects, or be sufficiently extensible for other projects to extend it to match.
-
-  * Allow external code to subclass components that are within a project which has
-    been built by the myfaces-builder-plugin. MyFaces components are meant to be
-    used as a base for other code; it would be nice to be able to offer a build tool
-    that users can apply to their own code when extending myfaces classes in order
-    to inherit the same metadata.   
-  
-Gathering and saving meta-data
-
-  In order to drive all of the above artifact generation, metadata about the artifacts
-  to be generated is needed. There are several reasonable ways to gather this info.
-  
-  * For several years, Trinidad has used xml files to declare the necessary data.
-  
-  * The Tobago project uses java1.5 annotations (with compile-scope retention) plus
-    introspection of the classes (via the apt tool and the com.sun.mirror api) to
-    derive the necessary data.
-  
-  * The use of javadoc annotations for metadata (eg xdoclet) also has a long successful
-    history as a way to represent metadata.
-
-  []
-  
-  In addition, people will no doubt invent other solutions in the future.
-  
-  Therefore, the myfaces-builder-plugin provides "pluggable" metadata gathering in order
-  for different projects to represent their metadata as they wish. In fact, it should
-  support "chaining" of metadata gathering, so that part of the data can be gathered one
-  way, and part of it another way.
-  
-  After a project using the myfaces-builder-plugin is published, people can then derive
-  their own components from the classes in the published jarfile. They can always implement
-  their own solution for defining the necessary tag classes, config files, etc. However it
-  would be nice to allow this plugin to also be usable on that external code. And in fact
-  this same issue also occurs internally within myfaces, eg between the -api and -impl jars
-  of a JSF implementation. There are a number of possible solutions, but the one chosen is
-  for myfaces-builder-plugin to generate a .xml file containing the metadata it has gathered
-  about a project, and for this file to be published in the META-INF directory of each 
-  jarfile. This file can then be used as another source of meta-data by the builder plugin
-  itself; ie if the builder has built project A, then it can use the file it left in the
-  META-INF of A.jar in order to help build components that extend the classes in A.
-  
-Generating output
-
-  The whole point of the artifacts being generated (config files or java code) is that they
-  are very repetitive internally, varying only due to the metadata information. Therefore
-  a templating mechanism should be used to generate these.
-  
-  However there are a large number of possible templating solutions. In addition, the
-  trinidad plugin has a history of generating output via hard-coding print statements in
-  java rather than using templating.
-  
-  The builder plugin therefore also provides a "pluggable" generation mechanism, so that
-  projects can customise the process as they need. 
-  
-  Initially, builder will support the org.antlr.StringTemplate library as the template
-  mechanism, mainly because that is what Tobago currently uses. However there is no
-  reason why other approaches cannot be used.
-  
-Representing MetaData internally
-
-  Classes in the "model" package store all the metadata that can be gathered. The model is
-  therefore the union of all data needed by all supported projects. 
-  
-  The model objects are created/populated by the model-builders, and then used by the
-  various generator modules.
-  
-  The metadata itself can be written to xml and read back from xml. This allows the following:
-  
-  * the task of gathering the metadata can be one maven goal, with output being a file.
-
-  * the task of generating artfacts from metadata can just read the previously-created metadata
-    file without repeating the data-gathering process.
-    
-  []
-
-  It also means that:
-      
-  * metadata can be stored in a file in the META-INF of a published jar
-
-  * the builder plugin can re-read the file from the META-INF of a published jar, allowing
-    libraries to easily *extend* classes declared in a published jar and still have access
-    to the metadata for those ancestor classes.  ------
diff --git a/maven2-plugins/myfaces-builder-plugin/src/site/apt/properties.apt b/maven2-plugins/myfaces-builder-plugin/src/site/apt/properties.apt
deleted file mode 100644
index 02cb91c..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/site/apt/properties.apt
+++ /dev/null
@@ -1,146 +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.
- 
- ------
- Properties
- ------
- 
-Properties
- 
-    Components, converters and validators have properties. Usually,
-    properties must be defined on .tld files. Also, property getter/setter
-    and saveState/restoreState methods can be generated automatically, 
-    reducing the amount of code that should be maintained.
-    
-    Properties are inherited, so if a component/converter/validator extends
-    from a parent component/converter/validator that has some property 
-    defined, the child must have it on its .tld. 
-    
-    But sometimes we have the following scenarios:
-    
-     * Components, converters and validators also have properties with
-       no getter and setters (like "binding" property), which are implemented
-       in their tag classes or facelets tag handler.
-    
-     * Also, some properties implemented on a parent class are not 
-       implemented on some children, so we need to exclude it from its
-       tld definition.
-
-     * Users can implement its own setter and getter methods for properties.
-     
-     * Some properties are related only to component but should not be on
-       tld.
-       
-     * Some properties have some specific behavior (for example they could 
-       contains objects implementing StateHolder interface).
-       
-    All these cases could be handled using @JSFProperty and @JSFJspProperty
-    annotations. Below there are some examples describing how to use it.
-    
-* General case
-
-    The most common case is let the property body be generated.
-
--------------------
-  
-    @JSFProperty
-    public abstract String getAutocomplete();
-  
--------------------
-
-* Custom Implementation of getter/setters
-
-    One example is UIViewRoot "renderKitId" property: 
-    
--------------------
-    @JSFProperty
-    public String getRenderKitId()
-    {
-        //... custom implementation ...
-    }
-    
-    public void setRenderKitId(String renderKitId)
-    {
-        //... custom implementation ...
-    } 
--------------------
-
-* Properties without getter/setters
-
-    This syntax should be used only in very special cases and users should
-    use @JSFProperty annotation/doclet instead.
-
--------------------
-@JSFComponent(type = "javax.faces.ComponentBase", family = "javax.faces.ComponentBase", desc = "base component when all components must inherit", tagClass = "javax.faces.webapp.UIComponentELTag", configExcluded = true)
-@JSFJspProperty(name = "binding", 
-    returnType = "javax.faces.component.UIComponent", 
-    longDesc = "Identifies a backing bean property (of type UIComponent or appropriate subclass) to bind to this component instance. This value must be an EL expression.", desc = "backing bean property to bind to this component instance")
-public abstract class UIComponentBase extends UIComponent
-{
-    // .... some code ...
-}
--------------------
-
-* Excluding properties from tld
-
-    One example is UIParameter "rendered" property:
-
--------------------
-
-    /**
-     * Disable this property; although this class extends a base-class that defines a read/write rendered property, this
-     * particular subclass does not support setting it. Yes, this is broken OO design: direct all complaints to the JSF
-     * spec group.
-     */
-    @Override
-    @JSFProperty(tagExcluded = true)
-    public void setRendered(boolean state)
-    {
-        super.setRendered(state);
-        // call parent method due TCK problems
-        // throw new UnsupportedOperationException();
-    }
--------------------
-
-* Properties with different name in component and tag class
-
-    One example is UICommand "action" property. To change it on tld, 
-    use "jspName". 
-
--------------------
-    @JSFProperty(stateHolder = true, returnSignature = "java.lang.Object", jspName = "action")
-    public MethodExpression getActionExpression()
-    {
-        // .... some code ...
-    }
--------------------
-
-* MethodExpression/MethodBinding properties
-
--------------------
-
-    @JSFProperty(stateHolder = true, returnSignature = "void", methodSignature = "javax.faces.event.ActionEvent")
-    public MethodBinding getActionListener()
-    {
-        // .... some code ...
-    }
-    
-    @JSFProperty(stateHolder = true, returnSignature = "java.lang.Object", jspName = "action")
-    public MethodExpression getActionExpression()
-    {
-        // .... some code ...
-    }
--------------------
-
diff --git a/maven2-plugins/myfaces-builder-plugin/src/site/apt/setup.apt b/maven2-plugins/myfaces-builder-plugin/src/site/apt/setup.apt
deleted file mode 100644
index e7c3255..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/site/apt/setup.apt
+++ /dev/null
@@ -1,168 +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.
- 
- ------
- Setting up your project 
- ------
- 
-Setting up your project
- 
-* Configuring your pom.xml
-
-    According to your jsf version you will need to set the required
-    dependencies.
- 
-    In jsf 1.1 (use doclets).
-    
-------------------------------------------------------    
-        <dependency>
-            <groupId>org.apache.myfaces.core</groupId>
-            <artifactId>myfaces-api</artifactId>
-            <version>1.1.6</version>
-            <scope>provided</scope>
-        </dependency>
-------------------------------------------------------
-
-    In jsf 1.2 (use annotations).
-    
-------------------------------------------------------
-        <dependency>
-            <groupId>org.apache.myfaces.core</groupId>
-            <artifactId>myfaces-api</artifactId>
-            <version>1.2.6</version>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.myfaces.buildtools</groupId>
-            <artifactId>myfaces-builder-annotations</artifactId> 
-            <version>1.0.2</version>
-            <scope>provided</scope>
-        </dependency>
-------------------------------------------------------
-
-    If you are working with converters and validators, you should use
-    myfaces commons dependencies as base for it:
-
------------------------------------------------------------    
-        <dependency>
-            <groupId>org.apache.myfaces.commons</groupId>
-            <artifactId>myfaces-validators12</artifactId>
-            <version>1.0.0</version>
-            <scope>compile</scope>
-        </dependency>
-        
-        <dependency>
-            <groupId>org.apache.myfaces.commons</groupId>
-            <artifactId>myfaces-converters12</artifactId>
-            <version>1.0.0</version>
-            <scope>compile</scope>
-        </dependency>
------------------------------------------------------------
-
-    Then you need to define the plugin configuration in your projects 
-    pom.xml like this:
-    
--------------------
-    <build>
-        <resources>
-            <resource>
-                <directory>src/main/resources</directory>
-                <excludes>
-                    <exclude>**/*.vm</exclude>
-                </excludes>
-            </resource>    
-        </resources>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.myfaces.buildtools</groupId>
-                <artifactId>myfaces-builder-plugin</artifactId>
-                <version>1.0.2</version>
-                <executions>
-                    <execution>
-                      <id>buildmetadata</id>
-                      <goals>
-                        <goal>build-metadata</goal>
-                        <!-- when use components -->
-                        <goal>make-components</goal>
-                        <goal>make-tags</goal>
-                        
-                        <!-- when use validators -->
-                        <goal>make-validators</goal>
-                        <goal>make-validator-tags</goal>
-                        
-                        <!-- when use converters -->
-                        <goal>make-converter-tags</goal>                        
-                      </goals>
-                      <configuration>
-                            <!-- Use 1.1 or 1.2 according to your jsf version -->
-                            <jsfVersion>1.2</jsfVersion>
-                      </configuration>
-                    </execution>
-                    <execution>
-                      <id>makefacesconfig</id>
-                      <configuration>
-                          <xmlFile>META-INF/faces-config.xml</xmlFile>
-                      </configuration>
-                      <goals>
-                          <goal>make-config</goal>
-                      </goals>
-                    </execution>
-                    <execution>
-                        <id>maketld</id>
-                        <configuration>
-                            <xmlFile>META-INF/mycomponents.tld</xmlFile>
-                            <!-- as templateFile you can use tomahawk.vm or tomahawk12.vm -->
-                            <templateFile>mycomponents.tld.vm</templateFile>
-                            <params>
-                               <shortname>mycomponents</shortname>
-                               <uri>http://www.myorganitzation.org/mycomponents</uri>
-                               <displayname>Custom tag library.</displayname>
-                               <description>Enhanced standard JSP actions and custom MyFaces actions.</description>
-                            </params>
-                        </configuration>
-                        <goals>
-                            <goal>make-config</goal>
-                        </goals>
-                    </execution>
-                    <execution>
-                        <id>makefaceletstaglib</id>
-                        <configuration>
-                            <xmlFile>META-INF/mycomponents.taglib.xml</xmlFile>
-                            <xmlBaseFile>src/main/conf/META-INF/facelets-taglib-base.xml</xmlBaseFile>
-                            <templateFile>facelets-taglib.vm</templateFile>
-                            <params>
-                               <shortname>mycomponents</shortname>
-                               <uri>http://www.myorganitzation.org/mycomponents</uri>
-                            </params>
-                        </configuration>
-                        <goals>
-                            <goal>make-config</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
--------------------
-
-* Customizing your templates
-
-    The plugin uses velocity templates to generate files, and on its jar
-    there are some already defined. If you need some file (like a template
-    for tld) you can find the most up to date template on tomahawk core 
-    or core12. 
-
-    More detailed information can be found {{{templates.html}here}}.
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/site/apt/tags.apt b/maven2-plugins/myfaces-builder-plugin/src/site/apt/tags.apt
deleted file mode 100644
index 1e8874c..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/site/apt/tags.apt
+++ /dev/null
@@ -1,82 +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.
- 
- ------
- Creating Custom JSF Tags 
- ------
- 
-Creating Custom JSF Tags
- 
-    A JSF Tag needs the following elements:
-    
-     * JSP Tag class.
-     
-     * Tag entry on tld.
-
-     * Facelets Tag Handler class (optional).
-
-     * Tag entry on facelets taglib (optional).
-     
-    Myfaces builder plugin provide annotations/doclets to help users maintain
-    configuration files. In this way, all information for a tag is just in
-    one file.
-    
-    Any tag is registered on facelets taglib if it has a related tag handler.
-    Usually, custom tag classes should have facelets tag handlers with 
-    similar functions, but on facelets world there is no need to define
-    properties on a xml file.
-    
-Setting up your project
-
-    All information related can be found {{{setup.html}here}}.
-
-Configuration files (faces-config.xml, .tld, facelets taglib)
-
-    This {{{config-files.html}page}} shows some examples.
-    
-Annotate JSF Tag Classes
-
-    Just add the annotations/doclets as presented below:
-    
--------------------
-
-@JSFJspTag(
-    name = "f:valueChangeListener",
-    bodyContent = "empty")
-public class ValueChangeListenerTag extends 
-    GenericListenerTag<EditableValueHolder, ValueChangeListener>
-{
-
-    /** ............. some code goes here ................. **/
-    
-    @Override
-    @JSFJspAttribute(
-        className = "java.lang.String",
-        rtexprvalue = true)
-    public void setType(ValueExpression type)
-    {
-        super.setType(type);
-    }
-
-    @Override
-    @JSFJspAttribute(
-        className = "javax.faces.event.ValueChangeListener",
-        rtexprvalue = true)
-    public void setBinding(ValueExpression binding)
-    {
-        super.setBinding(binding);
-    }
-}
--------------------
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/site/apt/templates.apt b/maven2-plugins/myfaces-builder-plugin/src/site/apt/templates.apt
deleted file mode 100644
index eb65d91..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/site/apt/templates.apt
+++ /dev/null
@@ -1,54 +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.
- 
- ------
- Template Files 
- ------
- 
-Template Files
- 
-    The plugin uses apache velocity to generate several types of files like
-    component classes, tag classes, configuration files and others.
-    
-    In this way, the plugin provides flexibility, allowing users to write
-    custom templates to fit their needs.
-    
-    Template examples can be found  inside myfaces-builder-plugin jar file
-    on META-INF directory.
-    
-    All velocity template files by default should be on 
-    src/main/resource/META-INF path of your project. The plugin tries to
-    find the template first there and then on the plugin jar, so you
-    can override the base template copying it from the jar to this path.
-    
-    You can find template examples in the following locations:
-    
-     * myfaces core project source code.
-     
-     * tomahawk 
-       {{{http://svn.apache.org/repos/asf/myfaces/tomahawk/trunk/core/src/main/resources/META-INF/}core}},
-       {{{http://svn.apache.org/repos/asf/myfaces/tomahawk/trunk/core12/src/main/resources/META-INF/}core12}} 
-       and sandbox 
-       {{{http://svn.apache.org/repos/asf/myfaces/tomahawk/trunk/sandbox/core/src/main/resources/META-INF/}core}},
-       {{{http://svn.apache.org/repos/asf/myfaces/tomahawk/trunk/sandbox/core12/src/main/resources/META-INF/}core12}}
-       source code.
-     
-     * myfaces commons source code (
-       {{{http://svn.apache.org/repos/asf/myfaces/commons/trunk/myfaces-commons-converters/src/main/resources/META-INF/}converters}} and
-       {{{http://svn.apache.org/repos/asf/myfaces/commons/trunk/myfaces-commons-validators/src/main/resources/META-INF/}validators}} ).  
-    
-    As new release of builder plugin continues, new templates will be added
-    to myfaces-builder-plugin jar, but the latest ones can be found on 
-    the previous locations.
diff --git a/maven2-plugins/myfaces-builder-plugin/src/site/apt/validators.apt b/maven2-plugins/myfaces-builder-plugin/src/site/apt/validators.apt
deleted file mode 100644
index fab3bed..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/site/apt/validators.apt
+++ /dev/null
@@ -1,83 +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.
- 
- ------
- Creating Custom Validators 
- ------
- 
-Creating Custom Validators
- 
-    A JSF Validator needs the following elements:
-    
-     * A class implementing validator interface.
-     
-     * Entry on faces-config.xml.
-     
-     * Tag entry on tld.
-     
-     * Tag entry on facelets taglib (optional).
-     
-     * JSP Tag class
-     
-    Myfaces builder plugin provide annotations/doclets to help users maintain
-    configuration files, and generating both validator classes and 
-    validator jsp tag classes automatically. In this way, all information 
-    for a validator is just in one file (the class implementing 
-    Validator interface).
-    
-    For both jsf versions 1.1 and 1.2, it is necessary to provide  
-    base classes for validators and tag classes, where all generated should 
-    inherit. This class is on myfaces commons validators project, but 
-    users can provide custom templates implementations for it.
-    
-    It is possible to use abstract pattern for create validator classes,
-    in similar way to components. 
-
-Setting up your project
-
-    All information related can be found {{{setup.html}here}}.
-
-Configuration files (faces-config.xml, .tld, facelets taglib)
-
-    This {{{config-files.html}page}} shows some examples.
-
-Annotate Validator Classes
-
-    Just add the annotations/doclets as presented below:
-
--------------------
- @JSFValidator(
-   name = "mcv:validateEmail",
-   tagClass = "org.apache.myfaces.commons.validator.ValidateEmailTag")
-public class EmailValidator extends org.apache.myfaces.commons.validator.ValidatorBase
-{
-
-    public static final String VALIDATOR_ID = "org.apache.myfaces.commons.validator.Email";
- 
-    /** .......... impl code goes here ......... **/
-    
-    @JSFProperty
-    public String getProperty()
-    {
-        //Some stuff
-    }   
-}
--------------------
-
-Write a Validator Class using Abstract Pattern
-
-    See {{{http://myfaces.apache.org/commons/index.html}myfaces commons}}
-    validators project for examples.
-
diff --git a/maven2-plugins/myfaces-builder-plugin/src/site/site.xml b/maven2-plugins/myfaces-builder-plugin/src/site/site.xml
deleted file mode 100644
index d679121..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/site/site.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
--->
-
-<project name="Myfaces Builder Plugin">
-  <bannerLeft>
-    <name>Apache MyFaces</name>
-    <src>img/banners/MyFaces_logo.jpg</src>
-    <href>http://myfaces.apache.org/index.html</href>
-  </bannerLeft>
-
-  <bannerRight>
-    <name>Apache Banner</name>
-    <src>img/banners/apache_banner.png</src>
-    <href>http://www.apache.org/</href>
-  </bannerRight>  
-
-  <publishDate format="dd MMM yyyy"/>
-
-  <skin>
-    <groupId>org.apache.myfaces.maven</groupId>
-    <artifactId>myfaces-site-skin</artifactId>
-    <version>1-SNAPSHOT</version>
-  </skin>
-
-
-  <body>
-    <links>
-      <item name="Apache" href="http://www.apache.org"/>
-      <item name="MyFaces" href="http://myfaces.apache.org/index.html"/>
-    </links>
-
-    <menu name="Overview">
-      <item name="Introduction" href="index.html"/>
-      <item name="Goals" href="plugin-info.html"/>
-      <item name="How to Use" href="howto.html"/>
-	  <item name="Plugin Javadoc" href="apidocs/index.html"/>
-      <item name="Doclets and Annotations" href="doclets-annotations.html"/>
-	  <item name="Annotations Javadoc" href="http://myfaces.apache.org/build-tools/plugins/myfaces-builder-annotations/apidocs/index.html"/>
-      <item name="Wiki" href="http://wiki.apache.org/myfaces/MyfacesBuilderPlugin"/>
-    </menu>
-
-    <menu name="Users Guide">
-      <item name="Setting up your project" href="setup.html"/>
-      <item name="Template Files" href="templates.html"/>
-      <item name="Configuration Files" href="config-files.html"/>
-      <item name="Components" href="components.html"/>      
-      <item name="Converters" href="converters.html"/>
-      <item name="Validators" href="validators.html"/>
-      <item name="Properties for Components, Converters and Validators" href="properties.html"/>
-      <item name="JSP Tags" href="tags.html"/>
-      <item name="Attributes for JSP Tags" href="attributes.html"/>
-    </menu>
-
-    <menu ref="reports"/>
-
-  </body>
-</project>
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/BuildMetaDataMojoTest.java b/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/BuildMetaDataMojoTest.java
deleted file mode 100644
index 9388e13..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/BuildMetaDataMojoTest.java
+++ /dev/null
@@ -1,55 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder;
-
-import junit.framework.TestCase;
-
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ComponentMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.PropertyMeta;
-
-/**
- * Tests the faces-config.xml generation mojo.
- */
-public class BuildMetaDataMojoTest extends TestCase
-{
-    public void testWrite() throws Exception
-    {
-        Model model = new Model();
-
-        ComponentMeta comp = new ComponentMeta();
-        comp.setName("mockComponent");
-        comp.setClassName("example.MockComponent");
-        comp.setDescription("dummy desc");
-        comp.setLongDescription("dummy long desc");
-        comp.setFamily("mockFamily");
-        comp.setParentClassName("javax.faces.UIComponent");
-        comp.setType("mockType");
-
-        PropertyMeta prop = new PropertyMeta();
-        prop.setName("mockProp");
-        prop.setDescription("propdesc");
-        prop.setLiteralOnly(Boolean.TRUE);
-        prop.setRequired(Boolean.TRUE);
-        comp.addProperty(prop);
-
-        model.addComponent(comp);
-
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/FlattenerTest.java b/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/FlattenerTest.java
deleted file mode 100644
index 8a58f00..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/FlattenerTest.java
+++ /dev/null
@@ -1,160 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder;
-
-import java.io.BufferedReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-
-import junit.framework.TestCase;
-
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-
-/**
- * Test flattening of a model.
- */
-public class FlattenerTest extends TestCase
-{
-    /**
-     * Load the "goodfile.xml" from the complex test case, flattens it and
-     * then compares the result to an expected good file.
-     */
-    public void testComplex() throws Exception
-    {
-        ClassLoader classLoader = this.getClass().getClassLoader();
-
-        InputStream is = classLoader
-                .getResourceAsStream("builder/complex/goodfile.xml");
-        String orig = readAll(is);
-        is.close();
-
-        Model model = IOUtils.readModel(new StringReader(orig));
-
-        new Flattener(model).flatten();
-        
-        StringWriter dstWriter = new StringWriter();
-        IOUtils.writeModel(model, dstWriter);
-        String dst = dstWriter.toString();
-
-        // Dump the output to disk, to help debugging if something fails
-        writeAll("target/complex-flat.xml", dst);
-        
-        // now load goodfile-flat.xml and check that it is as expected
-        InputStream is2 = classLoader
-                .getResourceAsStream("builder/complex/goodfile-flat.xml");
-        compareData(new StringReader(dst), new InputStreamReader(is2));
-        is2.close();
-    }
-
-    /**
-     * Load the "goodfile.xml" from the generation test case, flattens it and
-     * then compares the result to an expected good file.
-     */
-    public void testGeneration() throws Exception
-    {
-        ClassLoader classLoader = this.getClass().getClassLoader();
-
-        InputStream is = classLoader
-                .getResourceAsStream("builder/generation/goodfile.xml");
-        String orig = readAll(is);
-        is.close();
-
-        Model model = IOUtils.readModel(new StringReader(orig));
-
-        new Flattener(model).flatten();
-        
-        StringWriter dstWriter = new StringWriter();
-        IOUtils.writeModel(model, dstWriter);
-        String dst = dstWriter.toString();
-
-        // Dump the output to disk, to help debugging if something fails
-        writeAll("target/generation-flat.xml", dst);
-        
-        // now load goodfile-flat.xml and check that it is as expected
-        InputStream is2 = classLoader
-                .getResourceAsStream("builder/generation/goodfile-flat.xml");
-        compareData(new StringReader(dst), new InputStreamReader(is2));
-        is2.close();
-    }
-
-    /**
-     * Read the contents of an input stream into a string.
-     */
-    private String readAll(InputStream is) throws IOException
-    {
-        InputStreamReader reader = new InputStreamReader(is);
-        StringBuffer out = new StringBuffer(4096);
-        char[] buf = new char[1024];
-        while (true)
-        {
-            int nchars = reader.read(buf);
-            if (nchars <= 0)
-            {
-                break;
-            }
-            out.append(buf, 0, nchars);
-        }
-        return out.toString();
-    }
-
-    private void writeAll(String dstFile, String src) throws Exception
-    {
-        FileWriter fw = new FileWriter(dstFile);
-        fw.write(src);
-        fw.close();
-    }
-
-    /**
-     * Compare the contents of two Reader objects line-by-line.
-     */
-    private void compareData(Reader src1, Reader src2) throws IOException
-    {
-        BufferedReader in1 = new BufferedReader(src1);
-        BufferedReader in2 = new BufferedReader(src2);
-
-        int line = 0;
-        for (;;)
-        {
-            ++line;
-            String line1 = in1.readLine();
-            String line2 = in2.readLine();
-
-            if ((line1 == null) && (line2 == null))
-            {
-                // success
-                return;
-            }
-            else if (line1 == null)
-            {
-                fail("input 2 has more lines than input 1");
-            }
-            else if (line2 == null)
-            {
-                fail("input 1 has more lines than input 2");
-            }
-
-            assertEquals("Inputs differ on line " + line, line1, line2);
-        }
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/IOUtilsTest.java b/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/IOUtilsTest.java
deleted file mode 100644
index dd304f6..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/IOUtilsTest.java
+++ /dev/null
@@ -1,124 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder;
-
-import java.io.BufferedReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-
-import junit.framework.TestCase;
-
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-
-/**
- * Tests saving and loading models from xml.
- */
-public class IOUtilsTest extends TestCase
-{
-    /**
-     * Load the "goodfile.xml" from the complex test case and build a Model
-     * object from it, then save it again and compare to the original.
-     */
-    public void testComplex() throws Exception
-    {
-        ClassLoader classLoader = this.getClass().getClassLoader();
-
-        InputStream is = classLoader
-                .getResourceAsStream("builder/complex/goodfile.xml");
-        String src = readAll(is);
-        is.close();
-
-        StringReader srcReader = new StringReader(src);
-        Model model = IOUtils.readModel(srcReader);
-
-        StringWriter dstWriter = new StringWriter();
-        IOUtils.writeModel(model, dstWriter);
-        String dst = dstWriter.toString();
-        writeAll("target/outfile-ioutils.xml", dst);
-
-        srcReader = new StringReader(src);
-        StringReader dstReader = new StringReader(dst);
-        compareData(srcReader, dstReader);
-    }
-
-    /**
-     * Read the contents of an input stream into a string.
-     */
-    private String readAll(InputStream is) throws IOException
-    {
-        InputStreamReader reader = new InputStreamReader(is);
-        StringBuffer out = new StringBuffer(4096);
-        char[] buf = new char[1024];
-        while (true)
-        {
-            int nchars = reader.read(buf);
-            if (nchars <= 0)
-            {
-                break;
-            }
-            out.append(buf, 0, nchars);
-        }
-        return out.toString();
-    }
-
-    private void writeAll(String dstFile, String src) throws Exception
-    {
-        FileWriter fw = new FileWriter(dstFile);
-        fw.write(src);
-        fw.close();
-    }
-
-    /**
-     * Compare the contents of two Reader objects line-by-line.
-     */
-    private void compareData(Reader src1, Reader src2) throws IOException
-    {
-        BufferedReader in1 = new BufferedReader(src1);
-        BufferedReader in2 = new BufferedReader(src2);
-
-        int line = 0;
-        for (;;)
-        {
-            ++line;
-            String line1 = in1.readLine();
-            String line2 = in2.readLine();
-
-            if ((line1 == null) && (line2 == null))
-            {
-                // success
-                return;
-            }
-            else if (line1 == null)
-            {
-                fail("input 2 has more lines than input 1");
-            }
-            else if (line2 == null)
-            {
-                fail("input 1 has more lines than input 2");
-            }
-
-            assertEquals("Inputs differ on line " + line, line1, line2);
-        }
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeComponentsMojoTest.java b/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeComponentsMojoTest.java
deleted file mode 100644
index d708d84..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/MakeComponentsMojoTest.java
+++ /dev/null
@@ -1,42 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder;
-
-import junit.framework.TestCase;
-
-/**
- * Tests the component generation mojo
- */
-public class MakeComponentsMojoTest extends TestCase
-{
-    public void testCleanInitializerExpression() throws Exception
-    {
-        String badExpr =
-            "  // some stuff\n" +
-            "\n"
-            + "  true";
-
-        String cleaned = MakeComponentsMojo.cleanInitializationExpression(badExpr);
-        String good = "true";
-        assertEquals(good, cleaned);
-        
-        assertEquals(null, MakeComponentsMojo.cleanInitializationExpression("  "));
-        assertEquals(null, MakeComponentsMojo.cleanInitializationExpression("  // blah"));
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilderTest.java b/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilderTest.java
deleted file mode 100644
index 22b9f70..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/builder/qdox/QdoxModelBuilderTest.java
+++ /dev/null
@@ -1,267 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.builder.qdox;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringWriter;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.apache.myfaces.buildtools.maven2.plugin.builder.IOUtils;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.ComponentMeta;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.Model;
-import org.apache.myfaces.buildtools.maven2.plugin.builder.model.PropertyMeta;
-
-/**
- * Tests the QDoxModelBuilderTest generation mojo.
- */
-public class QdoxModelBuilderTest extends TestCase
-{
-    public void testMethodToPropName() throws Exception
-    {
-        assertEquals("fooBar", QdoxModelBuilder.methodToPropName("getfooBar"));
-        assertEquals("fooBar", QdoxModelBuilder.methodToPropName("getFooBar"));
-        assertEquals("url", QdoxModelBuilder.methodToPropName("getUrl"));
-        assertEquals("url", QdoxModelBuilder.methodToPropName("getURL"));
-        assertEquals("urlLocation", QdoxModelBuilder
-                .methodToPropName("getUrlLocation"));
-        assertEquals("urlLocation", QdoxModelBuilder
-                .methodToPropName("getURLLocation"));
-    }
-
-    public void testScan() throws Exception
-    {
-        QdoxModelBuilder builder = new QdoxModelBuilder();
-        Model model = new Model();
-        model.setModelId("test");
-
-        URL sourceUrl = this.getClass().getClassLoader().getResource(
-                "builder/simple/Foo.java");
-        String parentDirName = new File(sourceUrl.getFile()).getParent();
-        File parentDir = new File(parentDirName);
-        List sourceDirs = new ArrayList();
-        sourceDirs.add(parentDir.getAbsolutePath());
-        builder.buildModel(model, sourceDirs);
-
-        assertEquals(1, model.getComponents().size());
-        ComponentMeta cm = (ComponentMeta) model.getComponents().get(0);
-        assertEquals(1, cm.propertiesSize());
-        Iterator props = cm.properties();
-        PropertyMeta prop1 = (PropertyMeta) props.next();
-        assertEquals("prop1", prop1.getName());
-        assertEquals("java.lang.String", prop1.getClassName());
-    }
-
-    /**
-     * Scan a very simple source tree, and compare the result (line by line)
-     * against a "known good" file.
-     */
-    public void testSimple() throws Exception
-    {
-        QdoxModelBuilder builder = new QdoxModelBuilder();
-
-        ClassLoader classLoader = this.getClass().getClassLoader();
-        URL sourceUrl = classLoader.getResource("builder/simple/Foo.java");
-        String parentDirName = new File(sourceUrl.getFile()).getParent();
-        File parentDir = new File(parentDirName);
-        List sourceDirs = new ArrayList();
-        sourceDirs.add(parentDir.getAbsolutePath());
-
-        Model model = new Model();
-        model.setModelId("test");
-        builder.buildModel(model, sourceDirs);
-
-        // basic sanity checks
-        assertTrue(model.getComponents().size() > 0);
-
-        // Now write it. Optionally, we could just write it to an in-memory
-        // buffer.
-        File outfile = new File("target/simple-out.xml");
-        IOUtils.saveModel(model, outfile);
-
-        StringWriter outbuf = new StringWriter();
-        IOUtils.writeModel(model, outbuf);
-
-        compareData(outfile, "builder/simple/goodfile.xml");
-    }
-
-    /**
-     * Scan a very simple source tree that uses java15 annotations, and compare
-     * the result (line by line) against a "known good" file.
-     */
-    public void testSimple15() throws Exception
-    {
-        QdoxModelBuilder builder = new QdoxModelBuilder();
-
-        ClassLoader classLoader = this.getClass().getClassLoader();
-        URL sourceUrl = classLoader.getResource("builder/simple15/Foo.java");
-        String parentDirName = new File(sourceUrl.getFile()).getParent();
-        File parentDir = new File(parentDirName);
-        List sourceDirs = new ArrayList();
-        sourceDirs.add(parentDir.getAbsolutePath());
-
-        Model model = new Model();
-        model.setModelId("test");
-        builder.buildModel(model, sourceDirs);
-
-        // basic sanity checks
-        assertTrue(model.getComponents().size() > 0);
-
-        // Now write it. Optionally, we could just write it to an in-memory
-        // buffer.
-        File outfile = new File("target/simple15-out.xml");
-        IOUtils.saveModel(model, outfile);
-
-        StringWriter outbuf = new StringWriter();
-        IOUtils.writeModel(model, outbuf);
-
-        compareData(outfile, "builder/simple15/goodfile.xml");
-    }
-
-    /**
-     * Scan annotated JSFComponent classes which use code-generation to 
-     * actually create component classes.
-     */
-    public void testGeneration() throws Exception
-    {
-        QdoxModelBuilder builder = new QdoxModelBuilder();
-
-        ClassLoader classLoader = this.getClass().getClassLoader();
-        URL sourceUrl = classLoader
-                .getResource("builder/generation/testpkg/ComponentBase.java");
-        String parentDirName = new File(sourceUrl.getFile()).getParent();
-        File parentDir = new File(parentDirName);
-        File baseDir = parentDir.getParentFile();
-        List sourceDirs = new ArrayList();
-        sourceDirs.add(baseDir.getAbsolutePath());
-
-        Model model = new Model();
-        model.setModelId("test");
-        builder.buildModel(model, sourceDirs);
-
-        // basic sanity checks
-        assertTrue(model.getComponents().size() > 0);
-
-        // Now write it. Optionally, we could just write it to an in-memory
-        // buffer.
-        File outfile = new File("target/generation-out.xml");
-        IOUtils.saveModel(model, outfile);
-
-        StringWriter outbuf = new StringWriter();
-        IOUtils.writeModel(model, outbuf);
-
-        compareData(outfile, "builder/generation/goodfile.xml");
-    }
-
-    /**
-     * Scan a very complex source tree, containing all the different features in
-     * various combinations, then dump the result to a file and compare it (line
-     * by line) against a "known good" file.
-     */
-    public void testComplex() throws Exception
-    {
-        QdoxModelBuilder builder = new QdoxModelBuilder();
-
-        ClassLoader classLoader = this.getClass().getClassLoader();
-        URL sourceUrl = classLoader
-                .getResource("builder/complex/ComponentBase.java");
-        String parentDirName = new File(sourceUrl.getFile()).getParent();
-        File parentDir = new File(parentDirName);
-        List sourceDirs = new ArrayList();
-        sourceDirs.add(parentDir.getAbsolutePath());
-
-        Model model = new Model();
-        model.setModelId("test");
-        builder.buildModel(model, sourceDirs);
-
-        // basic sanity checks
-        assertTrue(model.getComponents().size() > 0);
-
-        // Now write it. Optionally, we could just write it to an in-memory
-        // buffer.
-        File outfile = new File("target/complex-out.xml");
-        IOUtils.saveModel(model, outfile);
-
-        StringWriter outbuf = new StringWriter();
-        IOUtils.writeModel(model, outbuf);
-
-        compareData(outfile, "builder/complex/goodfile.xml");
-    }
-
-    /**
-     * Compare the contents of two Reader objects line-by-line.
-     */
-    private void compareData(File testDatafileName, String goodResourceName) throws IOException
-    {
-        Reader testDataReaderRaw = new FileReader(testDatafileName);
-
-        ClassLoader classLoader = this.getClass().getClassLoader();
-        InputStream goodDataStream = classLoader.getResourceAsStream(goodResourceName);
-        assertNotNull("good resource file not found: " + goodResourceName, goodDataStream);
-        Reader goodDataReaderRaw = new InputStreamReader(goodDataStream);
-
-        BufferedReader testDataReader = new BufferedReader(testDataReaderRaw);
-        BufferedReader goodDataReader = new BufferedReader(goodDataReaderRaw);
-
-        try
-        {
-            int line = 0;
-            for (;;)
-            {
-                ++line;
-                String testLine = testDataReader.readLine();
-                String goodLine = goodDataReader.readLine();
-    
-                if ((testLine == null) && (goodLine == null))
-                {
-                    // success
-                    break;
-                }
-                else if (testLine == null)
-                {
-                    fail("Test input " + testDatafileName + " has fewer lines than good file " + goodResourceName);
-                }
-                else if (goodLine == null)
-                {
-                    fail("Test input " + testDatafileName + " has more lines than good file " + goodResourceName);
-                }
-    
-                assertEquals(
-                        "Test input " + testDatafileName + " and good file " + goodResourceName +
-                        " differ on line " + line, 
-                        goodLine, testLine);
-            }
-        }
-        finally
-        {
-            testDataReaderRaw.close();
-            goodDataStream.close();
-        }
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/ComponentBase.java b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/ComponentBase.java
deleted file mode 100644
index 775bdd4..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/ComponentBase.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * A base component class.
- * <p>
- * This is a base component. It has no name, so is not a concrete component.
- * 
- * @JSFComponent
- *   type="base"
- *   family="base"
- *   defaultRendererType="BaseRenderer"
- */
-
-public abstract class ComponentBase
-{
-    /**
-     * The prop1 property.
-     * <p>
-     * Some dummy prop1 documentation.
-     *
-     * @JSFProperty
-     */
-    public abstract String getProp1();
-    
-    public abstract void setProp1(String prop1);
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/ComponentChild.java b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/ComponentChild.java
deleted file mode 100644
index 0fca1a2..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/ComponentChild.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * The ComponentChild component.
- * <p>
- * This is a child component. It does nothing useful.
- * 
- * @JSFComponent
- *   name="foo"
- *   type="foo"
- *   family="foo"
- *   defaultRendererType="FooRenderer"
- */
-public class ComponentChild extends ComponentBase implements ComponentInterface
-{
-    String prop1;
-    boolean prop2;
-    
-    /**
-     * Implement the abstract property defined on the base class.
-     * Note that because this method is not annotated with the
-     * JSFProperty annotation, this comment does not become the
-     * documentation for the property itself.
-     */
-    public String getProp1()
-    {
-        return prop1;
-    }
-
-    public void setProp1(String prop1)
-    {
-        this.prop1 = prop1;
-    }
-
-    /**
-     * The prop2 property.
-     * <p>
-     * Some dummy prop2 documentation.
-     *
-     * @JSFProperty
-     */
-    public boolean getProp2() {
-        return prop2;
-    }
-    
-    public void setProp2(boolean prop2) {
-        this.prop2 = prop2;
-    }
-
-    /**
-     * Implement the method defined on ComponentInterface. Because this method does
-     * not use the JSFProperty annotation, the property settings are taken from the
-     * parent interface, not here.
-     */
-    public String getIfaceProp()
-    {
-        return null;
-    }
-
-    public void setIfaceProp(String val)
-    {
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/ComponentInterface.java b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/ComponentInterface.java
deleted file mode 100644
index c26b52b..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/ComponentInterface.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * An interface that defines component properties.
- * <p>
- * This is an interface component.
- * 
- * @JSFComponent
- *   type="iface"
- *   family="iface"
- *   defaultRendererType="BaseRenderer"
- */
-
-public interface ComponentInterface
-{
-    /**
-     * The ifaceProp property.
-     * <p>
-     * Some dummy ifaceProp documentation.
-     *
-     * @JSFProperty
-     */
-    String getIfaceProp();
-    
-    void setIfaceProp(String val);
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/Converter1.java b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/Converter1.java
deleted file mode 100644
index 2687628..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/Converter1.java
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * The Converter1 converter.
- * <p>
- * This is a silly converter. It does nothing useful.
- * 
- * @JSFConverter id="conv1"
- */
-public class Converter1 // implements Converter
-{
-    // TODO: converters can have properties too
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/Validator1.java b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/Validator1.java
deleted file mode 100644
index 0464aba..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/Validator1.java
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * The Validator1 validator.
- * <p>
- * This is a silly validator. It does nothing useful.
- * 
- * @JSFValidator id="val1"
- */
-public class Validator1 // implements Validator
-{
-    // TODO: validators can have properties too
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/goodfile-flat.xml b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/goodfile-flat.xml
deleted file mode 100644
index 5904dca..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/goodfile-flat.xml
+++ /dev/null
@@ -1,151 +0,0 @@
-<?xml version='1.0' ?>
-
-<model>
-  <modelId>test</modelId>
-  <component>
-    <modelId>test</modelId>
-    <className>ComponentBase</className>
-    <sourceClassName>ComponentBase</sourceClassName>
-    <type>base</type>
-    <family>base</family>
-    <rendererType>BaseRenderer</rendererType>
-    <desc>A base component class</desc>
-    <longDesc>
-<![CDATA[
-A base component class.
-<p>
-This is a base component. It has no name, so is not a concrete component.
-]]>
-    </longDesc>
-    <property>
-      <name>prop1</name>
-      <className>java.lang.String</className>
-      <desc>The prop1 property</desc>
-      <longDesc>
-<![CDATA[
-The prop1 property.
-<p>
-Some dummy prop1 documentation.
-]]>
-      </longDesc>
-      <generated>true</generated>
-    </property>
-  </component>
-  <component>
-    <modelId>test</modelId>
-    <className>ComponentInterface</className>
-    <sourceClassName>ComponentInterface</sourceClassName>
-    <type>iface</type>
-    <family>iface</family>
-    <rendererType>BaseRenderer</rendererType>
-    <desc>An interface that defines component properties</desc>
-    <longDesc>
-<![CDATA[
-An interface that defines component properties.
-<p>
-This is an interface component.
-]]>
-    </longDesc>
-    <property>
-      <name>ifaceProp</name>
-      <className>java.lang.String</className>
-      <desc>The ifaceProp property</desc>
-      <longDesc>
-<![CDATA[
-The ifaceProp property.
-<p>
-Some dummy ifaceProp documentation.
-]]>
-      </longDesc>
-    </property>
-  </component>
-  <component>
-    <modelId>test</modelId>
-    <className>ComponentChild</className>
-    <parentClassName>ComponentBase</parentClassName>
-    <sourceClassName>ComponentChild</sourceClassName>
-    <sourceClassParentClassName>ComponentBase</sourceClassParentClassName>
-    <interfaces>
-      <interface name="ComponentInterface"/>
-    </interfaces>
-    <name>foo</name>
-    <type>foo</type>
-    <family>foo</family>
-    <rendererType>FooRenderer</rendererType>
-    <desc>The ComponentChild component</desc>
-    <longDesc>
-<![CDATA[
-The ComponentChild component.
-<p>
-This is a child component. It does nothing useful.
-]]>
-    </longDesc>
-    <property>
-      <name>prop2</name>
-      <className>boolean</className>
-      <desc>The prop2 property</desc>
-      <longDesc>
-<![CDATA[
-The prop2 property.
-<p>
-Some dummy prop2 documentation.
-]]>
-      </longDesc>
-    </property>
-    <property>
-      <name>prop1</name>
-      <className>java.lang.String</className>
-      <desc>The prop1 property</desc>
-      <longDesc>
-<![CDATA[
-The prop1 property.
-<p>
-Some dummy prop1 documentation.
-]]>
-      </longDesc>
-      <inherited>true</inherited>
-      <generated>true</generated>
-    </property>
-    <property>
-      <name>ifaceProp</name>
-      <className>java.lang.String</className>
-      <desc>The ifaceProp property</desc>
-      <longDesc>
-<![CDATA[
-The ifaceProp property.
-<p>
-Some dummy ifaceProp documentation.
-]]>
-      </longDesc>
-      <inherited>true</inherited>
-    </property>
-  </component>
-  <converter>
-    <modelId>test</modelId>
-    <className>Converter1</className>
-    <sourceClassName>Converter1</sourceClassName>
-    <converterId>conv1</converterId>
-    <desc>The Converter1 converter</desc>
-    <longDesc>
-<![CDATA[
-The Converter1 converter.
-<p>
-This is a silly converter. It does nothing useful.
-]]>
-    </longDesc>
-  </converter>
-  <validator>
-    <modelId>test</modelId>
-    <className>Validator1</className>
-    <sourceClassName>Validator1</sourceClassName>
-    <validatorId>val1</validatorId>
-    <desc>The Validator1 validator</desc>
-    <longDesc>
-<![CDATA[
-The Validator1 validator.
-<p>
-This is a silly validator. It does nothing useful.
-]]>
-    </longDesc>
-  </validator>
-</model>
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/goodfile.xml b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/goodfile.xml
deleted file mode 100644
index deb3f61..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/complex/goodfile.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version='1.0' ?>
-
-<model>
-  <modelId>test</modelId>
-  <component>
-    <modelId>test</modelId>
-    <className>ComponentBase</className>
-    <sourceClassName>ComponentBase</sourceClassName>
-    <type>base</type>
-    <family>base</family>
-    <rendererType>BaseRenderer</rendererType>
-    <desc>A base component class</desc>
-    <longDesc>
-<![CDATA[
-A base component class.
-<p>
-This is a base component. It has no name, so is not a concrete component.
-]]>
-    </longDesc>
-    <property>
-      <name>prop1</name>
-      <className>java.lang.String</className>
-      <desc>The prop1 property</desc>
-      <longDesc>
-<![CDATA[
-The prop1 property.
-<p>
-Some dummy prop1 documentation.
-]]>
-      </longDesc>
-      <generated>true</generated>
-    </property>
-  </component>
-  <component>
-    <modelId>test</modelId>
-    <className>ComponentInterface</className>
-    <sourceClassName>ComponentInterface</sourceClassName>
-    <type>iface</type>
-    <family>iface</family>
-    <rendererType>BaseRenderer</rendererType>
-    <desc>An interface that defines component properties</desc>
-    <longDesc>
-<![CDATA[
-An interface that defines component properties.
-<p>
-This is an interface component.
-]]>
-    </longDesc>
-    <property>
-      <name>ifaceProp</name>
-      <className>java.lang.String</className>
-      <desc>The ifaceProp property</desc>
-      <longDesc>
-<![CDATA[
-The ifaceProp property.
-<p>
-Some dummy ifaceProp documentation.
-]]>
-      </longDesc>
-    </property>
-  </component>
-  <component>
-    <modelId>test</modelId>
-    <className>ComponentChild</className>
-    <parentClassName>ComponentBase</parentClassName>
-    <sourceClassName>ComponentChild</sourceClassName>
-    <sourceClassParentClassName>ComponentBase</sourceClassParentClassName>
-    <interfaces>
-      <interface name="ComponentInterface"/>
-    </interfaces>
-    <name>foo</name>
-    <type>foo</type>
-    <family>foo</family>
-    <rendererType>FooRenderer</rendererType>
-    <desc>The ComponentChild component</desc>
-    <longDesc>
-<![CDATA[
-The ComponentChild component.
-<p>
-This is a child component. It does nothing useful.
-]]>
-    </longDesc>
-    <property>
-      <name>prop2</name>
-      <className>boolean</className>
-      <desc>The prop2 property</desc>
-      <longDesc>
-<![CDATA[
-The prop2 property.
-<p>
-Some dummy prop2 documentation.
-]]>
-      </longDesc>
-    </property>
-  </component>
-  <converter>
-    <modelId>test</modelId>
-    <className>Converter1</className>
-    <sourceClassName>Converter1</sourceClassName>
-    <converterId>conv1</converterId>
-    <desc>The Converter1 converter</desc>
-    <longDesc>
-<![CDATA[
-The Converter1 converter.
-<p>
-This is a silly converter. It does nothing useful.
-]]>
-    </longDesc>
-  </converter>
-  <validator>
-    <modelId>test</modelId>
-    <className>Validator1</className>
-    <sourceClassName>Validator1</sourceClassName>
-    <validatorId>val1</validatorId>
-    <desc>The Validator1 validator</desc>
-    <longDesc>
-<![CDATA[
-The Validator1 validator.
-<p>
-This is a silly validator. It does nothing useful.
-]]>
-    </longDesc>
-  </validator>
-</model>
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/goodfile-flat.xml b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/goodfile-flat.xml
deleted file mode 100644
index 2e69a70..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/goodfile-flat.xml
+++ /dev/null
@@ -1,218 +0,0 @@
-<?xml version='1.0' ?>
-
-<model>
-  <modelId>test</modelId>
-  <component>
-    <modelId>test</modelId>
-    <className>testpkg.ComponentBase</className>
-    <sourceClassName>testpkg.ComponentBase</sourceClassName>
-    <type>base</type>
-    <family>base</family>
-    <rendererType>BaseRenderer</rendererType>
-    <desc>A base component class</desc>
-    <longDesc>
-<![CDATA[
-A base component class.
-<p>
-This is a base component. It has no name, so is not a concrete component.
-]]>
-    </longDesc>
-    <property>
-      <name>prop1</name>
-      <className>java.lang.String</className>
-      <desc>The prop1 property</desc>
-      <longDesc>
-<![CDATA[
-The prop1 property.
-<p>
-Some dummy prop1 documentation.
-]]>
-      </longDesc>
-      <generated>true</generated>
-    </property>
-  </component>
-  <component>
-    <modelId>test</modelId>
-    <className>testpkg.ComponentInterface</className>
-    <sourceClassName>testpkg.ComponentInterface</sourceClassName>
-    <type>iface</type>
-    <family>iface</family>
-    <rendererType>BaseRenderer</rendererType>
-    <desc>An interface that defines component properties</desc>
-    <longDesc>
-<![CDATA[
-An interface that defines component properties.
-<p>
-This is an interface component.
-]]>
-    </longDesc>
-    <property>
-      <name>ifaceProp</name>
-      <className>java.lang.String</className>
-      <desc>The ifaceProp property</desc>
-      <longDesc>
-<![CDATA[
-The ifaceProp property.
-<p>
-Some dummy ifaceProp documentation.
-]]>
-      </longDesc>
-    </property>
-  </component>
-  <component>
-    <modelId>test</modelId>
-    <className>testpkg.SubclassComponent</className>
-    <parentClassName>testpkg.ComponentBase</parentClassName>
-    <sourceClassName>testpkg.ComponentGenSubclass</sourceClassName>
-    <sourceClassParentClassName>testpkg.ComponentBase</sourceClassParentClassName>
-    <interfaces>
-      <interface name="testpkg.ComponentInterface"/>
-    </interfaces>
-    <name>fooFromSubclass</name>
-    <type>foo</type>
-    <family>foo</family>
-    <rendererType>FooRenderer</rendererType>
-    <generatedComponentClass>true</generatedComponentClass>
-    <desc>A class for which a concrete component will be created using "subclass mode" code-generation</desc>
-    <longDesc>A class for which a concrete component will be created using "subclass mode" code-generation.</longDesc>
-    <property>
-      <name>prop1</name>
-      <className>java.lang.String</className>
-      <desc>The prop1 property</desc>
-      <longDesc>
-<![CDATA[
-The prop1 property.
-<p>
-Some dummy prop1 documentation.
-]]>
-      </longDesc>
-      <inherited>true</inherited>
-      <generated>true</generated>
-    </property>
-    <property>
-      <name>ifaceProp</name>
-      <className>java.lang.String</className>
-      <desc>The ifaceProp property</desc>
-      <longDesc>
-<![CDATA[
-The ifaceProp property.
-<p>
-Some dummy ifaceProp documentation.
-]]>
-      </longDesc>
-      <inherited>true</inherited>
-    </property>
-  </component>
-  <component>
-    <modelId>test</modelId>
-    <className>testpkg.TemplateComponent</className>
-    <parentClassName>testpkg.ComponentBase</parentClassName>
-    <sourceClassName>testpkg.ComponentGenTemplate</sourceClassName>
-    <sourceClassParentClassName>testpkg.ComponentBase</sourceClassParentClassName>
-    <interfaces>
-      <interface name="testpkg.ComponentInterface"/>
-    </interfaces>
-    <name>fooFromTemplate</name>
-    <type>foo</type>
-    <family>foo</family>
-    <rendererType>FooRenderer</rendererType>
-    <generatedComponentClass>true</generatedComponentClass>
-    <template>true</template>
-    <desc>A class for which a concrete component will be created using "template mode" code-generation</desc>
-    <longDesc>A class for which a concrete component will be created using "template mode" code-generation.</longDesc>
-    <property>
-      <name>prop2</name>
-      <className>boolean</className>
-      <desc>The prop2 property</desc>
-      <longDesc>
-<![CDATA[
-The prop2 property.
-<p>
-Some dummy prop2 documentation.
-]]>
-      </longDesc>
-    </property>
-    <property>
-      <name>prop1</name>
-      <className>java.lang.String</className>
-      <desc>The prop1 property</desc>
-      <longDesc>
-<![CDATA[
-The prop1 property.
-<p>
-Some dummy prop1 documentation.
-]]>
-      </longDesc>
-      <inherited>true</inherited>
-      <generated>true</generated>
-    </property>
-    <property>
-      <name>ifaceProp</name>
-      <className>java.lang.String</className>
-      <desc>The ifaceProp property</desc>
-      <longDesc>
-<![CDATA[
-The ifaceProp property.
-<p>
-Some dummy ifaceProp documentation.
-]]>
-      </longDesc>
-      <inherited>true</inherited>
-    </property>
-  </component>
-  <component>
-    <modelId>test</modelId>
-    <className>testpkg.ComponentManual</className>
-    <parentClassName>testpkg.ComponentBase</parentClassName>
-    <sourceClassName>testpkg.ComponentManual</sourceClassName>
-    <sourceClassParentClassName>testpkg.ComponentBase</sourceClassParentClassName>
-    <interfaces>
-      <interface name="testpkg.ComponentInterface"/>
-    </interfaces>
-    <name>foo</name>
-    <type>foo</type>
-    <family>foo</family>
-    <rendererType>FooRenderer</rendererType>
-    <desc>A concrete component class that has been written by hand (no code generation)</desc>
-    <longDesc>A concrete component class that has been written by hand (no code generation).</longDesc>
-    <property>
-      <name>prop2</name>
-      <className>boolean</className>
-      <desc>The prop2 property</desc>
-      <longDesc>
-<![CDATA[
-The prop2 property.
-<p>
-Some dummy prop2 documentation.
-]]>
-      </longDesc>
-    </property>
-    <property>
-      <name>prop1</name>
-      <className>java.lang.String</className>
-      <desc>The prop1 property</desc>
-      <longDesc>
-<![CDATA[
-The prop1 property.
-<p>
-Some dummy prop1 documentation.
-]]>
-      </longDesc>
-      <inherited>true</inherited>
-      <generated>true</generated>
-    </property>
-    <property>
-      <name>ifaceProp</name>
-      <className>java.lang.String</className>
-      <desc>The ifaceProp property</desc>
-      <longDesc>
-<![CDATA[
-The ifaceProp property.
-<p>
-Some dummy ifaceProp documentation.
-]]>
-      </longDesc>
-      <inherited>true</inherited>
-    </property>
-  </component>
-</model>
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/goodfile.xml b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/goodfile.xml
deleted file mode 100644
index d10451e..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/goodfile.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version='1.0' ?>
-
-<model>
-  <modelId>test</modelId>
-  <component>
-    <modelId>test</modelId>
-    <className>testpkg.ComponentBase</className>
-    <sourceClassName>testpkg.ComponentBase</sourceClassName>
-    <type>base</type>
-    <family>base</family>
-    <rendererType>BaseRenderer</rendererType>
-    <desc>A base component class</desc>
-    <longDesc>
-<![CDATA[
-A base component class.
-<p>
-This is a base component. It has no name, so is not a concrete component.
-]]>
-    </longDesc>
-    <property>
-      <name>prop1</name>
-      <className>java.lang.String</className>
-      <desc>The prop1 property</desc>
-      <longDesc>
-<![CDATA[
-The prop1 property.
-<p>
-Some dummy prop1 documentation.
-]]>
-      </longDesc>
-      <generated>true</generated>
-    </property>
-  </component>
-  <component>
-    <modelId>test</modelId>
-    <className>testpkg.ComponentInterface</className>
-    <sourceClassName>testpkg.ComponentInterface</sourceClassName>
-    <type>iface</type>
-    <family>iface</family>
-    <rendererType>BaseRenderer</rendererType>
-    <desc>An interface that defines component properties</desc>
-    <longDesc>
-<![CDATA[
-An interface that defines component properties.
-<p>
-This is an interface component.
-]]>
-    </longDesc>
-    <property>
-      <name>ifaceProp</name>
-      <className>java.lang.String</className>
-      <desc>The ifaceProp property</desc>
-      <longDesc>
-<![CDATA[
-The ifaceProp property.
-<p>
-Some dummy ifaceProp documentation.
-]]>
-      </longDesc>
-    </property>
-  </component>
-  <component>
-    <modelId>test</modelId>
-    <className>testpkg.SubclassComponent</className>
-    <parentClassName>testpkg.ComponentBase</parentClassName>
-    <sourceClassName>testpkg.ComponentGenSubclass</sourceClassName>
-    <sourceClassParentClassName>testpkg.ComponentBase</sourceClassParentClassName>
-    <interfaces>
-      <interface name="testpkg.ComponentInterface"/>
-    </interfaces>
-    <name>fooFromSubclass</name>
-    <type>foo</type>
-    <family>foo</family>
-    <rendererType>FooRenderer</rendererType>
-    <generatedComponentClass>true</generatedComponentClass>
-    <desc>A class for which a concrete component will be created using "subclass mode" code-generation</desc>
-    <longDesc>A class for which a concrete component will be created using "subclass mode" code-generation.</longDesc>
-  </component>
-  <component>
-    <modelId>test</modelId>
-    <className>testpkg.TemplateComponent</className>
-    <parentClassName>testpkg.ComponentBase</parentClassName>
-    <sourceClassName>testpkg.ComponentGenTemplate</sourceClassName>
-    <sourceClassParentClassName>testpkg.ComponentBase</sourceClassParentClassName>
-    <interfaces>
-      <interface name="testpkg.ComponentInterface"/>
-    </interfaces>
-    <name>fooFromTemplate</name>
-    <type>foo</type>
-    <family>foo</family>
-    <rendererType>FooRenderer</rendererType>
-    <generatedComponentClass>true</generatedComponentClass>
-    <template>true</template>
-    <desc>A class for which a concrete component will be created using "template mode" code-generation</desc>
-    <longDesc>A class for which a concrete component will be created using "template mode" code-generation.</longDesc>
-    <property>
-      <name>prop2</name>
-      <className>boolean</className>
-      <desc>The prop2 property</desc>
-      <longDesc>
-<![CDATA[
-The prop2 property.
-<p>
-Some dummy prop2 documentation.
-]]>
-      </longDesc>
-    </property>
-  </component>
-  <component>
-    <modelId>test</modelId>
-    <className>testpkg.ComponentManual</className>
-    <parentClassName>testpkg.ComponentBase</parentClassName>
-    <sourceClassName>testpkg.ComponentManual</sourceClassName>
-    <sourceClassParentClassName>testpkg.ComponentBase</sourceClassParentClassName>
-    <interfaces>
-      <interface name="testpkg.ComponentInterface"/>
-    </interfaces>
-    <name>foo</name>
-    <type>foo</type>
-    <family>foo</family>
-    <rendererType>FooRenderer</rendererType>
-    <desc>A concrete component class that has been written by hand (no code generation)</desc>
-    <longDesc>A concrete component class that has been written by hand (no code generation).</longDesc>
-    <property>
-      <name>prop2</name>
-      <className>boolean</className>
-      <desc>The prop2 property</desc>
-      <longDesc>
-<![CDATA[
-The prop2 property.
-<p>
-Some dummy prop2 documentation.
-]]>
-      </longDesc>
-    </property>
-  </component>
-</model>
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/testpkg/ComponentBase.java b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/testpkg/ComponentBase.java
deleted file mode 100644
index 0d6af88..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/testpkg/ComponentBase.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package testpkg;
-
-/**
- * A base component class.
- * <p>
- * This is a base component. It has no name, so is not a concrete component.
- * 
- * @JSFComponent
- *   type="base"
- *   family="base"
- *   defaultRendererType="BaseRenderer"
- */
-
-public abstract class ComponentBase
-{
-    /**
-     * The prop1 property.
-     * <p>
-     * Some dummy prop1 documentation.
-     *
-     * @JSFProperty
-     */
-    public abstract String getProp1();
-    
-    public abstract void setProp1(String prop1);
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/testpkg/ComponentGenSubclass.java b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/testpkg/ComponentGenSubclass.java
deleted file mode 100644
index d3328d2..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/testpkg/ComponentGenSubclass.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package testpkg;
-
-/**
- * A class for which a concrete component will be created using "subclass mode" code-generation.
- * 
- * @JSFComponent
- *   name="fooFromSubclass"
- *   type="foo"
- *   family="foo"
- *   defaultRendererType="FooRenderer"
- *   class="testpkg.SubclassComponent"
- */
-public abstract class ComponentGenSubclass extends ComponentBase implements ComponentInterface
-{
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/testpkg/ComponentGenTemplate.java b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/testpkg/ComponentGenTemplate.java
deleted file mode 100644
index 98d9a38..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/testpkg/ComponentGenTemplate.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package testpkg;
-
-/**
- * A class for which a concrete component will be created using "template mode" code-generation.
- * 
- * @JSFComponent
- *   name="fooFromTemplate"
- *   type="foo"
- *   family="foo"
- *   defaultRendererType="FooRenderer"
- *   class="testpkg.TemplateComponent"
- *   template="true"
- */
-abstract class ComponentGenTemplate extends ComponentBase implements ComponentInterface
-{
-    String prop1;
-    boolean prop2;
-    
-    /**
-     * Implement the abstract property defined on the base class.
-     * Note that because this method is not annotated with the
-     * JSFProperty annotation, this comment does not become the
-     * documentation for the property itself.
-     */
-    public String getProp1()
-    {
-        return prop1;
-    }
-
-    public void setProp1(String prop1)
-    {
-        this.prop1 = prop1;
-    }
-
-    /**
-     * The prop2 property.
-     * <p>
-     * Some dummy prop2 documentation.
-     *
-     * @JSFProperty
-     */
-    public boolean getProp2() {
-        return prop2;
-    }
-    
-    public void setProp2(boolean prop2) {
-        this.prop2 = prop2;
-    }
-
-    /**
-     * Implement the method defined on ComponentInterface. Because this method does
-     * not use the JSFProperty annotation, the property settings are taken from the
-     * parent interface, not here.
-     */
-    public String getIfaceProp()
-    {
-        return null;
-    }
-
-    public void setIfaceProp(String val)
-    {
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/testpkg/ComponentInterface.java b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/testpkg/ComponentInterface.java
deleted file mode 100644
index 9b6c04d..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/testpkg/ComponentInterface.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package testpkg;
-
-/**
- * An interface that defines component properties.
- * <p>
- * This is an interface component.
- * 
- * @JSFComponent
- *   type="iface"
- *   family="iface"
- *   defaultRendererType="BaseRenderer"
- */
-
-public interface ComponentInterface
-{
-    /**
-     * The ifaceProp property.
-     * <p>
-     * Some dummy ifaceProp documentation.
-     *
-     * @JSFProperty
-     */
-    String getIfaceProp();
-    
-    void setIfaceProp(String val);
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/testpkg/ComponentManual.java b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/testpkg/ComponentManual.java
deleted file mode 100644
index 2e1f305..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/generation/testpkg/ComponentManual.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package testpkg;
-
-/**
- * A concrete component class that has been written by hand (no code generation).
- * 
- * @JSFComponent
- *   name="foo"
- *   type="foo"
- *   family="foo"
- *   defaultRendererType="FooRenderer"
- */
-public class ComponentManual extends ComponentBase implements ComponentInterface
-{
-    String prop1;
-    boolean prop2;
-    
-    /**
-     * Implement the abstract property defined on the base class.
-     * Note that because this method is not annotated with the
-     * JSFProperty annotation, this comment does not become the
-     * documentation for the property itself.
-     */
-    public String getProp1()
-    {
-        return prop1;
-    }
-
-    public void setProp1(String prop1)
-    {
-        this.prop1 = prop1;
-    }
-
-    /**
-     * The prop2 property.
-     * <p>
-     * Some dummy prop2 documentation.
-     *
-     * @JSFProperty
-     */
-    public boolean getProp2() {
-        return prop2;
-    }
-    
-    public void setProp2(boolean prop2) {
-        this.prop2 = prop2;
-    }
-
-    /**
-     * Implement the method defined on ComponentInterface. Because this method does
-     * not use the JSFProperty annotation, the property settings are taken from the
-     * parent interface, not here.
-     */
-    public String getIfaceProp()
-    {
-        return null;
-    }
-
-    public void setIfaceProp(String val)
-    {
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/simple/Foo.java b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/simple/Foo.java
deleted file mode 100644
index 950adb1..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/simple/Foo.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * The Foo component.
- * <p>
- * This is a foo component. It does nothing useful.
- * 
- * @JSFComponent
- *   name="foo"
- *   type="foo"
- *   family="foo"
- *   defaultRendererType="FooRenderer"
- */
-public class Foo
-{
-    String prop1;
-    
-    /**
-     * The prop1 property.
-     * <p>
-     * Some dummy prop1 documentatoin.
-     *
-     * @JSFProperty
-     */
-    public String getProp1() {
-        return prop1;
-    }
-    
-    public void setProp1(String prop1) {
-        this.prop1 = prop1;
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/simple/goodfile.xml b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/simple/goodfile.xml
deleted file mode 100644
index f3ca12f..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/simple/goodfile.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version='1.0' ?>
-
-<model>
-  <modelId>test</modelId>
-  <component>
-    <modelId>test</modelId>
-    <className>Foo</className>
-    <sourceClassName>Foo</sourceClassName>
-    <name>foo</name>
-    <type>foo</type>
-    <family>foo</family>
-    <rendererType>FooRenderer</rendererType>
-    <desc>The Foo component</desc>
-    <longDesc>
-<![CDATA[
-The Foo component.
-<p>
-This is a foo component. It does nothing useful.
-]]>
-    </longDesc>
-    <property>
-      <name>prop1</name>
-      <className>java.lang.String</className>
-      <desc>The prop1 property</desc>
-      <longDesc>
-<![CDATA[
-The prop1 property.
-<p>
-Some dummy prop1 documentatoin.
-]]>
-      </longDesc>
-    </property>
-  </component>
-</model>
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/simple15/Foo.java b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/simple15/Foo.java
deleted file mode 100644
index fe1d318..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/simple15/Foo.java
+++ /dev/null
@@ -1,26 +0,0 @@
-import org.apache.myfaces.buildtools.annotation.*;
-
-/**
- * The Foo component defined via java15 annotations.
- * <p>
- * This is an annotated foo component. It does nothing useful.
- */
-@JSFComponent(name="foo", type="foo", family="foo", defaultRendererType="FooRenderer")
-public class Foo
-{
-    String prop1;
-    
-    /**
-     * The prop1 property.
-     * <p>
-     * Some dummy prop1 documentatoin.
-     */
-    @JSFProperty
-    public String getProp1() {
-        return prop1;
-    }
-    
-    public void setProp1(String prop1) {
-        this.prop1 = prop1;
-    }
-}
diff --git a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/simple15/goodfile.xml b/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/simple15/goodfile.xml
deleted file mode 100644
index 3cb04e0..0000000
--- a/maven2-plugins/myfaces-builder-plugin/src/test/resources/builder/simple15/goodfile.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version='1.0' ?>
-
-<model>
-  <modelId>test</modelId>
-  <component>
-    <modelId>test</modelId>
-    <className>Foo</className>
-    <sourceClassName>Foo</sourceClassName>
-    <name>foo</name>
-    <type>foo</type>
-    <family>foo</family>
-    <rendererType>FooRenderer</rendererType>
-    <desc>The Foo component defined via java15 annotations</desc>
-    <longDesc>
-<![CDATA[
-The Foo component defined via java15 annotations.
-<p>
-This is an annotated foo component. It does nothing useful.
-]]>
-    </longDesc>
-    <property>
-      <name>prop1</name>
-      <className>java.lang.String</className>
-      <desc>The prop1 property</desc>
-      <longDesc>
-<![CDATA[
-The prop1 property.
-<p>
-Some dummy prop1 documentatoin.
-]]>
-      </longDesc>
-    </property>
-  </component>
-</model>
diff --git a/maven2-plugins/myfaces-faces-plugin/LICENSE.txt b/maven2-plugins/myfaces-faces-plugin/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/maven2-plugins/myfaces-faces-plugin/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/maven2-plugins/myfaces-faces-plugin/NOTICE.txt b/maven2-plugins/myfaces-faces-plugin/NOTICE.txt
deleted file mode 100644
index fa3dbd6..0000000
--- a/maven2-plugins/myfaces-faces-plugin/NOTICE.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-=========================================================================
-==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
-==  Version 2.0, in this case for the Apache MyFaces Maven Plugins     ==
-=========================================================================
-
-This product includes software developed by 
-The Apache Software Foundation (http://www.apache.org/).
-
-Portions of this software were originally based on the following:
-
- - software copyright (c) 2000-2006, Oracle Corp, <http://www.oracle.com/>.
-and are licensed to the Apache Software Foundation under the 
-"Software Grant and Corporate Contribution License Agreement"
-
-See the LICENSE.txt file for information on all licenses 
-associated with this software.
diff --git a/maven2-plugins/myfaces-faces-plugin/pom.xml b/maven2-plugins/myfaces-faces-plugin/pom.xml
deleted file mode 100644
index 8efcccc..0000000
--- a/maven2-plugins/myfaces-faces-plugin/pom.xml
+++ /dev/null
@@ -1,122 +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.
-	   
--->
-<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>
-    <groupId>org.apache.myfaces.buildtools</groupId>
-    <artifactId>myfaces-plugin-parent</artifactId>
-    <version>1.0.2</version>
-  </parent>
-
-  <groupId>org.apache.myfaces.buildtools</groupId>
-  <artifactId>myfaces-faces-plugin</artifactId> 
-  <version>1.0.1-SNAPSHOT</version>
-  <packaging>maven-plugin</packaging>
-  <name>Apache MyFaces Buildtools Maven2 Faces Plugin</name>
-  <description>
-    A maven plugin that uses metadata input files to generate JSF Component, Validator and Tag classes,
-    together with the associated configuration files (.tld, faces-config.xml, etc).
-  </description>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <inherited>true</inherited>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-        </configuration>
-      </plugin>
-      <plugin>
-        <!--
-          - Override checkstyle config file definitions from parent pom. The source of
-          - this project is not compliant with the normal MyFaces code style rules, and
-          - probably never will be.
-          -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-checkstyle-plugin</artifactId>
-        <version>2.2</version>
-        <configuration>
-          <configLocation>default/myfaces-checks-minimal.xml</configLocation>
-          <headerLocation>default/myfaces-header-spaces.txt</headerLocation>
-        </configuration>
-      </plugin>
-
-    </plugins>
-  </build>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-plugin-plugin</artifactId>
-        <version>2.2</version>
-      </plugin>
-    </plugins>
-  </reporting>
-  
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-      <version>2.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId>
-      <version>2.0</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-digester</groupId>
-      <artifactId>commons-digester</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>saxon</groupId>
-      <artifactId>saxon</artifactId>
-      <version>6.5.3</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>xerces</groupId>
-      <artifactId>xercesImpl</artifactId>
-      <version>2.6.2</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>stax</groupId>
-      <artifactId>stax-api</artifactId>
-      <version>1.0.1</version>
-    </dependency>
-    <dependency>
-      <groupId>stax</groupId>
-      <artifactId>stax</artifactId>
-      <version>1.2.0_rc2-dev</version>
-    </dependency>
-  </dependencies>
-
-</project>
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/AbstractFacesMojo.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/AbstractFacesMojo.java
deleted file mode 100644
index efd848a..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/AbstractFacesMojo.java
+++ /dev/null
@@ -1,679 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces;
-
-import org.apache.commons.digester.AbstractObjectCreationFactory;
-import org.apache.commons.digester.Digester;
-import org.apache.maven.artifact.DependencyResolutionRequiredException;
-import org.apache.maven.model.Resource;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.GeneratorHelper;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.FacesConfigBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.AttributeBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ComponentBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ConverterBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.FacesConfigParser;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ValidatorBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.AttributeFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.ComponentFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.ConverterFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.XIncludeFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.ValidatorFilter;
-import org.codehaus.plexus.util.FileUtils;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-import javax.xml.namespace.QName;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParserFactory;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.net.URLConnection;
-import java.util.*;
-
-abstract public class AbstractFacesMojo extends AbstractMojo
-{
-  protected List getCompileDependencyResources(
-    MavenProject project,
-    String       resourcePath) throws MojoExecutionException
-  {
-    try
-    {
-      ClassLoader cl = createCompileClassLoader(project);
-      Enumeration e = cl.getResources(resourcePath);
-      List urls = new ArrayList();
-      while (e.hasMoreElements())
-      {
-        URL url = (URL)e.nextElement();
-        urls.add(url);
-      }
-      return Collections.unmodifiableList(urls);
-    }
-    catch (IOException e)
-    {
-      throw new MojoExecutionException("Unable to get resources for path " +
-                                       "\"" + resourcePath + "\"", e);
-    }
-
-  }
-
-  protected void addResourceRoot(
-    MavenProject project,
-    String       resourceRoot)
-  {
-    List resources = project.getBuild().getResources();
-    Resource resource = new Resource();
-    resource.setDirectory(resourceRoot);
-    resources.add(resource);
-  }
-
-  /**
-   * @deprecated
-   */
-  protected URL[] readIndex(
-    MavenProject project,
-    String       resourcePath) throws MojoExecutionException
-  {
-    return readIndex(project);
-  }
-
-  protected List getMasterConfigs(
-    MavenProject project) throws MojoExecutionException
-  {
-    if (localResource != null)
-    {
-      List urls = new ArrayList();
-      try {
-        urls.add(localResource.toURL());
-      } catch (MalformedURLException e) {
-        getLog().error("", e);
-      }
-      return urls;  
-    }
-    else
-    {
-      String resourcePath = "META-INF/maven-faces-plugin/faces-config.xml";
-      return getCompileDependencyResources(project, resourcePath);
-    }
-  }
-
-  protected URL[] readIndex(
-    MavenProject project) throws MojoExecutionException
-  {
-    try
-    {
-      // 1. read master faces-config.xml resources
-      List masters = getMasterConfigs(project);
-      if (masters.isEmpty())
-      {
-        getLog().warn("Master faces-config.xml not found");
-        return new URL[0];
-      }
-      else
-      {
-        List entries = new LinkedList();
-
-        SAXParserFactory spf = SAXParserFactory.newInstance();
-        spf.setNamespaceAware(true);
-        // requires JAXP 1.3, in JavaSE 5.0
-        // spf.setXIncludeAware(false);
-
-        for (Iterator i=masters.iterator(); i.hasNext();)
-        {
-          URL url = (URL)i.next();
-          Digester digester = new Digester(spf.newSAXParser());
-          digester.setNamespaceAware(true);
-
-          // XInclude
-          digester.setRuleNamespaceURI(XIncludeFilter.XINCLUDE_NAMESPACE);
-          digester.addCallMethod("faces-config/include", "add", 1);
-          digester.addFactoryCreate("faces-config/include",
-                                    URLCreationFactory.class);
-          digester.addCallParam("faces-config/include", 0, 0);
-
-          digester.push(url);
-          digester.push(entries);
-          digester.parse(url.openStream());
-        }
-
-        return (URL[])entries.toArray(new URL[0]);
-      }
-    }
-    catch (ParserConfigurationException e)
-    {
-      throw new MojoExecutionException("Failed to parse master config", e);
-    }
-    catch (SAXException e)
-    {
-      throw new MojoExecutionException("Failed to parse master config", e);
-    }
-    catch (IOException e)
-    {
-      throw new MojoExecutionException("Failed to parse master config", e);
-    }
-  }
-
-  protected boolean isModifiedSince(
-    URL[] urls,
-    long  lastModified) throws IOException
-  {
-    for (int i=0; i < urls.length; i++)
-    {
-      URLConnection conn = urls[i].openConnection();
-      if (conn.getLastModified() > lastModified)
-        return true;
-    }
-
-    return false;
-  }
-
-  /**
-  * @deprecated call Util.convertStringToLiteral instead
-  */
-  protected String convertStringToLiteral(String value)
-  {
-    return Util.convertStringToLiteral("String", value);
-  }
-
- /**
-  * @deprecated call Util.convertStringToLiteral instead
-  */
-  protected String convertStringToLiteral(String className, String value)
-  {
-    return Util.convertStringToLiteral(className, value);
-  }
-
-  protected String readLicenseHeader() throws MojoExecutionException
-  {
-    if (licenseHeaderFile == null)
-    {
-      return _DEFAULT_LICENSE_HEADER;
-    }
-    
-    if (!licenseHeaderFile.exists())
-    {
-      throw new MojoExecutionException("License header file not found: "
-                                       +licenseHeaderFile.getName());
-    }
-
-    if (licenseHeaderFile.isDirectory())
-    {
-       throw new MojoExecutionException("Expecting a file and found a directory: "
-               +licenseHeaderFile.getName());
-    }
-
-    StringBuffer sb = new StringBuffer();
-    
-    try
-    {
-      BufferedReader reader = new BufferedReader(new FileReader(licenseHeaderFile));
-      String line;
-      
-      while ((line = reader.readLine()) != null)
-      {
-        sb.append(line+"\n");
-      }
-    }
-    catch (IOException e)
-    {
-      throw new MojoExecutionException("Exception reading license header file", e);
-    }
-    
-    return sb.toString();
-  }
-  
-  protected String getLicenseHeader() throws MojoExecutionException
-  {
-    if (_licenseHeader == null)
-    {
-      _licenseHeader = readLicenseHeader();
-    }
-    
-    return _licenseHeader;
-  }
-
-  static public class URLCreationFactory extends AbstractObjectCreationFactory
-  {
-    public Object createObject(
-      Attributes attributes) throws MalformedURLException
-    {
-      String href = attributes.getValue("href");
-      if (href == null)
-        throw new IllegalStateException("Missing href attribute");
-
-      URL master = (URL)digester.getRoot();
-      return new URL(master, href);
-    }
-  }
-
-  protected void processIndex(
-    MavenProject project,
-    String       resourcePath) throws MojoExecutionException
-  {
-    _facesConfig = new FacesConfigBean();
-
-    URL[] index = readIndex(project, resourcePath);
-    for (int i=0; i < index.length; i++)
-    {
-      processIndexEntry(index[i]);
-    }
-  }
-
-  protected void processIndexEntry(
-    URL entry) throws MojoExecutionException
-  {
-    URL old = _facesConfig.setCurrentResource(entry);
-    try
-    {
-      new FacesConfigParser().merge(_facesConfig, entry);
-    }
-    finally
-    {
-      _facesConfig.setCurrentResource(old);
-    }
-  }
-
-  protected FacesConfigBean getFacesConfig()
-  {
-    return _facesConfig;
-  }
-
-  protected void writePreamble(
-    PrettyWriter out) throws MojoExecutionException
-  {
-    out.write(_AUTO_GENERATE_WARNING);
-    out.write(getLicenseHeader());
-  }
-
-  protected void copyFile(
-    File   sourceDirectory,
-    String sourcePath,
-    File   targetDirectory) throws MojoExecutionException
-  {
-    try
-    {
-      File sourceFile = new File(sourceDirectory, sourcePath);
-      File targetFile = new File(targetDirectory, sourcePath);
-
-      if (sourceFile.exists() &&
-          sourceFile.lastModified() > targetFile.lastModified())
-      {
-        if (getLog().isDebugEnabled())
-          getLog().debug("Copying file \"" + sourcePath + "\"");
-
-        FileUtils.copyFile(sourceFile, targetFile);
-      }
-    }
-    catch (IOException e)
-    {
-      throw new MojoExecutionException("Error copying file \"" +
-                                       sourcePath + "\"", e);
-    }
-  }
-
- /**
-  * @deprecated use Util.writeImports instead
-  */
-  protected void writeImports(
-    PrettyWriter out,
-    String       packageName,
-    Set          imports)
-  {
-    GeneratorHelper.writeImports(out,packageName,imports);
-  }
-
-  private ClassLoader createCompileClassLoader(
-    MavenProject project) throws MojoExecutionException
-  {
-    Thread current = Thread.currentThread();
-    ClassLoader cl = current.getContextClassLoader();
-
-    try
-    {
-      List classpathElements = project.getCompileClasspathElements();
-      if (!classpathElements.isEmpty())
-      {
-        String[] entries = (String[])classpathElements.toArray(new String[0]);
-        URL[] urls = new URL[entries.length];
-        for (int i=0; i < urls.length; i++)
-        {
-          urls[i] = new File(entries[i]).toURL();
-        }
-        cl = new URLClassLoader(urls, cl);
-      }
-    }
-    catch (DependencyResolutionRequiredException e)
-    {
-      throw new MojoExecutionException("Error calculating scope classpath", e);
-    }
-    catch (MalformedURLException e)
-    {
-      throw new MojoExecutionException("Error calculating scope classpath", e);
-    }
-
-    return cl;
-  }
-
-  protected class SkipFilter extends ComponentFilter
-  {
-    protected boolean accept(
-      ComponentBean component)
-    {
-      String componentType = component.getComponentType();
-
-      // skip API and base class generation?
-      return !skipApiOrBaseClasses || (!componentType.startsWith("javax") &&
-                !componentType.endsWith("Base"));
-
-    }
-  }
-
-  static final protected class ComponentTypeFilter extends ComponentFilter
-  {
-    public ComponentTypeFilter(
-      String typePrefix)
-    {
-      _typePrefix = typePrefix;
-    }
-
-    protected boolean accept(
-      ComponentBean component)
-    {
-      String componentType = component.getComponentType();        
-      return (componentType.startsWith(_typePrefix));
-    }
-     private final String _typePrefix;
-  }
-
-  static final protected class ComponentClassFilter extends ComponentFilter
-  {
-    public ComponentClassFilter(
-      String packageContains)
-    {
-      _packageContains = packageContains;
-    }
-
-    protected boolean accept(
-      ComponentBean component)
-    {
-      String componentClass = component.getComponentClass();
-      String packageName = Util.getPackageFromFullClass(componentClass);
-
-      // accept only classes that match the package
-      return (packageName.contains(_packageContains));
-    }
-
-    private final String _packageContains;
-  }
-
-  static final protected class ComponentTagClassFilter extends ComponentFilter
-  {
-    public ComponentTagClassFilter(
-      String packageContains)
-    {
-      _packageContains = packageContains;
-    }
-
-    protected boolean accept(
-      ComponentBean component)
-    {
-      String tagClass = component.getTagClass();
-      String packageName = Util.getPackageFromFullClass(tagClass);
-
-      // accept only classes in this project's (sub)package
-      return (packageName.contains(_packageContains));
-    }
-
-    private final String _packageContains;
-  }
-
-  static final protected class ConverterTagClassFilter extends ConverterFilter
-  {
-    public ConverterTagClassFilter(
-      String packageContains)
-    {
-      _packageContains = packageContains;
-    }
-
-    protected boolean accept(
-      ConverterBean converter)
-    {
-      String tagClass = converter.getTagClass();
-      String packageName = Util.getPackageFromFullClass(tagClass);
-
-      // accept only classes that contain the desired string
-      return (packageName.contains(_packageContains));
-    }
-
-    private final String _packageContains;
-  }
-
-  static final protected class ValidatorTagClassFilter extends ValidatorFilter
-  {
-    public ValidatorTagClassFilter(
-      String packageContains)
-    {
-      _packageContains = packageContains;
-    }
-
-    protected boolean accept(
-      ValidatorBean validator)
-    {
-      String tagClass = validator.getTagClass();
-      String packageName = Util.getPackageFromFullClass(tagClass);
-
-      // accept only classes that contain the desired string
-      return (packageName.contains(_packageContains));
-    }
-
-    private final String _packageContains;
-  }
-
-  
-
-  static final protected class ComponentTagFilter extends ComponentFilter
-  {
-    protected boolean accept(
-      ComponentBean component)
-    {
-      return (component.getTagClass() != null);
-    }
-  }
-
-  static final protected class ConverterTagFilter extends ConverterFilter
-  {
-    protected boolean accept(
-      ConverterBean converter)
-    {
-      return (converter.getTagClass() != null);
-    }
-  }
-
-  static final protected class ValidatorTagFilter extends ValidatorFilter
-  {
-    protected boolean accept(
-      ValidatorBean validator)
-    {
-      return (validator.getTagClass() != null);
-    }
-  }
-
-  static final protected class ComponentTagLibraryFilter extends ComponentFilter
-  {
-    public ComponentTagLibraryFilter(
-      String namespaceURI)
-    {
-      this(namespaceURI, true);
-    }
-
-    public ComponentTagLibraryFilter(
-      String namespaceURI,
-      boolean requireTagClass)
-    {
-      _namespaceURI = namespaceURI;
-      _requireTagClass = requireTagClass;
-    }
-
-    protected boolean accept(
-      ComponentBean component)
-    {
-      QName tagName = component.getTagName();
-      String tagClass = component.getTagClass();
-
-      // accept if tagClass is present
-      // and if tagName is in the desired namespaceURI
-      return ((!_requireTagClass || (tagClass != null)) &&
-              tagName != null &&
-              _namespaceURI.equals(tagName.getNamespaceURI()));
-    }
-
-    private final String _namespaceURI;
-    private final boolean _requireTagClass;
-  }
-
-  static final protected class ValidatorTagLibraryFilter extends ValidatorFilter
-  {
-    public ValidatorTagLibraryFilter(
-      String namespaceURI)
-    {
-      this(namespaceURI, true);
-    }
-
-    public ValidatorTagLibraryFilter(
-      String namespaceURI,
-      boolean requireTagClass)
-    {
-      _namespaceURI = namespaceURI;
-      _requireTagClass = requireTagClass;
-    }
-
-    protected boolean accept(
-      ValidatorBean validator)
-    {
-      QName tagName = validator.getTagName();
-      String tagClass = validator.getTagClass();
-
-      // accept if tagClass is present
-      // and if tagName is in the desired namespaceURI
-      return ((!_requireTagClass || (tagClass != null)) &&
-              tagName != null &&
-              _namespaceURI.equals(tagName.getNamespaceURI()));
-    }
-
-    private final String _namespaceURI;
-    private final boolean _requireTagClass;
-  }
-
-  static final protected class ConverterTagLibraryFilter extends ConverterFilter
-  {
-    public ConverterTagLibraryFilter(
-      String namespaceURI)
-    {
-      this(namespaceURI, true);
-    }
-
-    public ConverterTagLibraryFilter(
-      String namespaceURI,
-      boolean requireTagClass)
-    {
-      _namespaceURI = namespaceURI;
-      _requireTagClass = requireTagClass;
-    }
-
-    protected boolean accept(
-      ConverterBean converter)
-    {
-      QName tagName = converter.getTagName();
-      String tagClass = converter.getTagClass();
-
-      // accept if tagClass is present
-      // and if tagName is in the desired namespaceURI
-      return ((!_requireTagClass || (tagClass != null)) &&
-              tagName != null &&
-              _namespaceURI.equals(tagName.getNamespaceURI()));
-    }
-
-    private final String _namespaceURI;
-    private final boolean _requireTagClass;
-  }
-
-  static protected class VirtualAttributeFilter extends AttributeFilter
-  {
-    protected boolean accept(
-      AttributeBean attribute)
-    {
-      return !attribute.isVirtual();
-    }
-  }
-
- /**
-  * @parameter
-  */
-  private File licenseHeaderFile;
-
-  /**
-  * @parameter default-value = "true"
-  */
-  private boolean skipApiOrBaseClasses;
-
-  /**
-   * @parameter
-   */
-  private File localResource;
-
-
-
-  private FacesConfigBean _facesConfig;
-  private String _licenseHeader;
-
-  static final private String _AUTO_GENERATE_WARNING =
-"// WARNING: This file was automatically generated. Do not edit it directly,\n"+
-"//          or you will lose your changes.\n\n";
-
-
-  static final private String _DEFAULT_LICENSE_HEADER =
-    "/*\n" +
-    " * Licensed to the Apache Software Foundation (ASF) under one\n" +
-    " * or more contributor license agreements.  See the NOTICE file\n" +
-    " * distributed with this work for additional information\n" +
-    " * regarding copyright ownership.  The ASF licenses this file\n" +
-    " * to you under the Apache License, Version 2.0 (the\n" +
-    " * \"License\"); you may not use this file except in compliance\n" +
-    " * with the License.  You may obtain a copy of the License at\n" +
-    " *\n" +
-    " *   http://www.apache.org/licenses/LICENSE-2.0\n" +
-    " *\n" +
-    " * Unless required by applicable law or agreed to in writing,\n" +
-    " * software distributed under the License is distributed on an\n" +
-    " * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n" +
-    " * KIND, either express or implied.  See the License for the\n" +
-    " * specific language governing permissions and limitations\n" +
-    " * under the License.\n" +
-    "*/\n";
-}
-  
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateComponentsMojo.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateComponentsMojo.java
deleted file mode 100644
index aacef22..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateComponentsMojo.java
+++ /dev/null
@@ -1,343 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces;
-
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.component.ComponentGenerator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.component.MyFacesComponentGenerator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.component.TrinidadComponentGenerator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ComponentBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.FacesConfigBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.ComponentFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.FilteredIterator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.SourceTemplate;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.lang.reflect.Modifier;
-import java.util.Iterator;
-
-/**
- * @version $Id$
- * @requiresDependencyResolution compile
- * @goal generate-components
- * @phase generate-sources
- */
-public class GenerateComponentsMojo extends AbstractFacesMojo
-{
-  /**
-   * Execute the Mojo.
-   */
-  public void execute() throws MojoExecutionException
-  {
-    try
-    {
-      processIndex(project, resourcePath);
-      _generateComponents();
-    }
-    catch (IOException e)
-    {
-      throw new MojoExecutionException("Error generating components", e);
-    }
-  }
-
-  /**
-   * Generates parsed components.
-   */
-  private void _generateComponents() throws IOException, MojoExecutionException
-  {
-    // Make sure generated source directory
-    // is added to compilation source path
-    project.addCompileSourceRoot(generatedSourceDirectory.getCanonicalPath());
-
-    FacesConfigBean facesConfig = getFacesConfig();
-    if (!facesConfig.hasComponents())
-    {
-      getLog().info("Nothing to generate - no components found");
-    }
-    else
-    {
-      if (suppressListenerMethods)
-      {
-        getLog().warn("Event listener methods will not be generated");
-      }
-
-      Iterator components = facesConfig.components();
-      components = new FilteredIterator(components, new SkipFilter());
-      components = new FilteredIterator(components,
-                                        new ComponentTypeFilter(typePrefix));
-
-      // incremental unless forced
-      if (!force)
-      {
-        components = new FilteredIterator(components, new IfModifiedFilter());
-      }
-
-      if (!components.hasNext())
-      {
-        getLog().info("Nothing to generate - all components are up to date");
-      }
-      else
-      {
-        int count = 0;
-        while (components.hasNext())
-        {
-          ComponentBean component = (ComponentBean)components.next();
-          if (!component.isComponentClassExcluded()){
-              _generateComponent(component);
-              count++;
-          }          
-        }
-        getLog().info("Generated " + count + " component(s)");
-      }
-    }
-  }
-
-  /**
-   * Generates a parsed component.
-   *
-   * @param component  the parsed component metadata
-   */
-  private void _generateComponent(
-    ComponentBean component) throws MojoExecutionException
-  {
-    ComponentGenerator generator;
-
-    String fullClassName = component.getComponentClass();
-
-    if (component.isTrinidadComponent())
-    {
-      generator = new TrinidadComponentGenerator(getLog(), _is12());
-    }
-    else 
-    {
-      generator = new MyFacesComponentGenerator(getLog(),_is12() );
-    }
-
-    try
-    {
-      getLog().debug("Generating " + fullClassName+", with generator: "+generator.getClass().getName());
-
-      String sourcePath = Util.convertClassToSourcePath(fullClassName, ".java");
-      File targetFile = new File(generatedSourceDirectory, sourcePath);
-
-      StringWriter sw = new StringWriter();
-      PrettyWriter out = new PrettyWriter(sw);
-
-      String className = Util.getClassFromFullClass(fullClassName);
-      String componentFamily = component.findComponentFamily();
-
-      if (componentFamily == null)
-      {
-        getLog().warn("Missing <component-family> for \"" +
-                       fullClassName + "\", generation of this Component is skipped");
-      }
-      else
-      {
-        String packageName = Util.getPackageFromFullClass(fullClassName);
-        String fullSuperclassName = component.findComponentSuperclass();
-        String superclassName = Util.getClassFromFullClass(fullSuperclassName);
-
-        // make class name fully qualified in case of collision
-        if (superclassName.equals(className))
-          superclassName = fullSuperclassName;
-
-        // TODO: remove this bogosity
-        if (superclassName.equals("UIXMenuHierarchy") ||
-            superclassName.equals("UIXTable") ||
-            superclassName.equals("UIXHierarchy") ||
-            superclassName.equals("UIXMenuTree") ||
-            className.equals("CoreTree"))
-        {
-          superclassName = fullSuperclassName;
-        }
-
-
-        String componentType = component.getComponentType();
-
-        // Use template file if it exists
-        String templatePath = Util.convertClassToSourcePath(fullClassName, "Template.java");
-        File templateFile = new File(templateSourceDirectory, templatePath);
-
-        SourceTemplate template = null;
-        if (templateFile.exists())
-        {
-          getLog().debug("Using template " + templatePath);
-          template = new SourceTemplate(templateFile);
-          template.substitute(className + "Template", className);
-          template.readPreface();
-        }
-
-        // header/copyright
-        writePreamble(out);
-
-        // package
-        out.println("package " + packageName + ";");
-        out.println();
-
-        // imports
-        generator.writeImports(out, template, packageName,
-                      fullSuperclassName, superclassName,
-                      component);
-
-        // class
-        generator.writeClassBegin(out, className, superclassName, component, template);
-
-        // static final constants
-        generator.writePropertyValueConstants(out, component);
-        generator.writePropertyConstants(out, superclassName, component);
-        generator.writeFacetConstants(out, component);
-        generator.writeGenericConstants(out, componentFamily, componentType);
-
-        // public constructors and methods
-        generator.writeConstructor(out, component, Modifier.PUBLIC);
-
-        // insert template code
-        if (template != null)
-        {
-          template.writeContent(out);
-          template.close();
-        }
-
-        generator.writeFacetMethods(out, component);
-
-        if (template == null)
-        {
-          generator.writePropertyMethods(out, component);
-        }
-        else
-        {
-          generator.writePropertyMethods(out, component, template.getIgnoreMethods());
-        }
-        
-        if (!suppressListenerMethods)
-        {
-          generator.writeListenerMethods(out, component);
-        }
-
-        generator.writeStateManagementMethods(out, component);
-
-        generator.writeGetFamily(out);
-
-        // protected constructors and methods
-        // TODO: reverse this order, to make protected constructor go first
-        //       for now we want consistency with previous code generation
-        generator.writeOther(out, component);
-
-        generator.writeClassEnd(out);
-
-        out.close();
-
-        // delay write in case of error
-        // timestamp should not be updated when an error occurs
-        // delete target file first, because it is readonly
-        targetFile.getParentFile().mkdirs();
-        targetFile.delete();
-        FileWriter fw = new FileWriter(targetFile);
-        StringBuffer buf = sw.getBuffer();
-        fw.write(buf.toString());
-        fw.close();
-        targetFile.setReadOnly();
-      }
-    }
-    catch (IOException e)
-    {
-      getLog().error("Error generating " + fullClassName, e);
-    }
-  }
-
-  private class IfModifiedFilter extends ComponentFilter
-  {
-    protected boolean accept(
-      ComponentBean component)
-    {
-      String componentClass = component.getComponentClass();
-      String sourcePath = Util.convertClassToSourcePath(componentClass, ".java");
-      String templatePath = Util.convertClassToSourcePath(componentClass, "Template.java");
-      File targetFile = new File(generatedSourceDirectory, sourcePath);
-      File templateFile = new File(templateSourceDirectory, templatePath);
-
-      // accept if templateFile is newer or component has been modified
-      return (templateFile.lastModified() > targetFile.lastModified() ||
-              component.isModifiedSince(targetFile.lastModified()));
-    }
-  }
-
-  private boolean _is12()
-  {
-    return "1.2".equals(jsfVersion) || "12".equals(jsfVersion);
-  }
-  
-
-  /**
-   * @parameter expression="${project}"
-   * @readonly
-   */
-  private MavenProject project;
-
-  /**
-   * @parameter
-   * @readonly
-   */
-  private String resourcePath = "META-INF/maven-faces-plugin/index.lst";
-
-  /**
-   * @parameter expression="src/main/java-templates"
-   * @required
-   */
-  private File templateSourceDirectory;
-
-  /**
-   * @parameter expression="${project.build.directory}/maven-faces-plugin/main/java"
-   * @required
-   */
-  private File generatedSourceDirectory;
-
-  /**
-   * @parameter
-   * @required
-   */
-  private String packageContains;
-
-  /**
-   * @parameter
-   * @required
-   */
-    private String typePrefix;
-
-  /**
-   * @parameter
-   */
-  private boolean force;
-
-  /**
-   * @parameter
-   */
-  private boolean suppressListenerMethods;
-
-  /**
-   * @parameter
-   */
-  private String jsfVersion;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateFaceletsTaglibsMojo.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateFaceletsTaglibsMojo.java
deleted file mode 100644
index 313146b..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateFaceletsTaglibsMojo.java
+++ /dev/null
@@ -1,433 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.stream.XMLOutputFactory;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.stream.StreamResult;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ComponentBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ConverterBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.FacesConfigBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ValidatorBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.FilteredIterator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.XIncludeFilter;
-
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-
-import org.codehaus.plexus.util.FileUtils;
-
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-
-/**
- * @version $Id$
- * @requiresDependencyResolution compile
- * @goal generate-facelets-taglibs
- * @phase generate-sources
- */
-public class GenerateFaceletsTaglibsMojo extends AbstractFacesMojo
-{
-  /**
-   * Execute the Mojo.
-   */
-  public void execute() throws MojoExecutionException
-  {
-    try
-    {
-      // always add resources directory to project resource root
-      addResourceRoot(project, generatedResourcesDirectory.getCanonicalPath());
-
-      processIndex(project, resourcePath);
-
-      // taglibs map syntax requires distinct shortNames,
-      // which is a Good Thing!
-      for (Iterator i = taglibs.entrySet().iterator(); i.hasNext(); )
-      {
-        Map.Entry entry = (Map.Entry)i.next();
-        String shortName = (String)entry.getKey();
-        String namespaceURI = (String)entry.getValue();
-
-        FacesConfigBean facesConfig = getFacesConfig();
-        Iterator components = facesConfig.components();
-        components = new FilteredIterator(components, new SkipFilter());
-        components = new FilteredIterator(components, new ComponentTagLibraryFilter(namespaceURI, false));
-
-        Iterator validators = facesConfig.validators();
-        validators = new FilteredIterator(validators, new ValidatorTagLibraryFilter(namespaceURI, false));
-
-        Iterator converters = facesConfig.converters();
-        converters = new FilteredIterator(converters, new ConverterTagLibraryFilter(namespaceURI, false));
-
-
-        String targetPath = "META-INF/" + shortName + ".taglib.xml";
-        File targetFile = new File(generatedResourcesDirectory, targetPath);
-
-        String configPath = "META-INF/" + shortName + "-base.taglib.xml";
-        File configFile = new File(configSourceDirectory, configPath);
-
-        targetFile.delete();
-
-        if ((components.hasNext()||validators.hasNext()||converters.hasNext())
-            && configFile.exists())
-        {
-          ByteArrayOutputStream out = new ByteArrayOutputStream();
-          XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
-          XMLStreamWriter stream = outputFactory.createXMLStreamWriter(out);
-
-          _writeStartTagLibrary(stream, _XINCLUDE_FACELETS_TAG_LIBRARY_DTD);
-          // base goes first
-          stream.writeStartElement("xi", "include",
-                                   XIncludeFilter.XINCLUDE_NAMESPACE);
-          stream.writeNamespace("xi", XIncludeFilter.XINCLUDE_NAMESPACE);
-          stream.writeAttribute("href", configFile.toURL().toExternalForm());
-          stream.writeAttribute("xpointer", "/facelet-taglib/*");
-          stream.writeEndElement();
-          _writeTags(components, validators, converters, stream);
-
-          _writeEndTagLibrary(stream);
-          stream.close();
-
-          InputStream mergedStream = new ByteArrayInputStream(out.toByteArray());
-
-          // expand all the xi:include elements
-          SAXParserFactory saxFactory = SAXParserFactory.newInstance();
-          saxFactory.setNamespaceAware(true);
-          saxFactory.setValidating(false);
-          SAXParser saxParser = saxFactory.newSAXParser();
-          XMLReader mergedReader = saxParser.getXMLReader();
-          mergedReader = new XIncludeFilter(mergedReader, configFile.toURL());
-          // even with validating=false, DTD is still downloaded so that
-          // any entities contained in the document can be expanded.
-          // the following disables that behavior, also saving the time
-          // spent to parse the DTD
-          mergedReader.setEntityResolver(new EntityResolver()
-            {
-              public InputSource resolveEntity(
-                String publicId,
-                String systemId)
-              {
-                return new InputSource(new ByteArrayInputStream(new byte[0]));
-              }
-            });
-          InputSource mergedInput = new InputSource(mergedStream);
-          Source mergedSource = new SAXSource(mergedReader, mergedInput);
-
-          targetFile.delete();
-          targetFile.getParentFile().mkdirs();
-          Result mergedResult = new StreamResult(targetFile);
-
-          TransformerFactory transFactory = TransformerFactory.newInstance();
-          Transformer identity = transFactory.newTransformer();
-          identity.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,
-                                     _FACELETS_TAG_LIBRARY_DOCTYPE_PUBLIC);
-          identity.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,
-                                     _FACELETS_TAG_LIBRARY_DOCTYPE_SYSTEM);
-          identity.transform(mergedSource, mergedResult);
-
-          targetFile.setReadOnly();
-        }
-        else if (components.hasNext()||validators.hasNext()||converters.hasNext())
-        {
-          targetFile.getParentFile().mkdirs();
-          OutputStream out = new FileOutputStream(targetFile);
-          XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
-          XMLStreamWriter stream = outputFactory.createXMLStreamWriter(out);
-
-          _writeStartTagLibrary(stream, _FACELETS_TAG_LIBRARY_DTD);
-          stream.writeCharacters("\n  ");
-          stream.writeStartElement("namespace");
-          stream.writeCharacters(namespaceURI);
-          stream.writeEndElement();
-
-          _writeTags(components, validators, converters, stream);
-          _writeEndTagLibrary(stream);
-          stream.close();
-        }
-        else if (configFile.exists())
-        {
-          // copy if newer
-          if (configFile.lastModified() > targetFile.lastModified())
-          {
-            targetFile.delete();
-            targetFile.getParentFile().mkdirs();
-            FileUtils.copyFile(configFile, targetFile);
-            targetFile.setReadOnly();
-          }
-        }
-
-        getLog().info("Generated " + targetPath);
-      }
-    }
-    catch (XMLStreamException e)
-    {
-      throw new MojoExecutionException("Error during generation", e);
-    }
-    catch (SAXException e)
-    {
-      throw new MojoExecutionException("Error during generation", e);
-    }
-    catch (TransformerException e)
-    {
-      throw new MojoExecutionException("Error during generation", e);
-    }
-    catch (ParserConfigurationException e)
-    {
-      throw new MojoExecutionException("Error during generation", e);
-    }
-    catch (IOException e)
-    {
-      throw new MojoExecutionException("Error during generation", e);
-    }
-  }
-
-  private void _writeTags(Iterator components, Iterator validators,
-          Iterator converters, XMLStreamWriter stream)
-      throws XMLStreamException
-  {
-    while (components.hasNext())
-    {
-      ComponentBean component = (ComponentBean)components.next();
-      _writeTag(stream, component);
-    }
-    while (validators.hasNext())
-    {
-      _writeValidatorTag(stream, (ValidatorBean) validators.next());
-    }
-    while (converters.hasNext())
-    {
-      _writeConverterTag(stream, (ConverterBean) converters.next());
-    }
-  }
-
-  private void _writeStartTagLibrary(
-    XMLStreamWriter stream,
-    String          dtd) throws XMLStreamException
-  {
-    stream.writeStartDocument("1.0");
-    stream.writeCharacters("\n");
-    stream.writeDTD(dtd);
-    stream.writeCharacters("\n");
-    stream.writeStartElement("facelet-taglib");
-    stream.writeDefaultNamespace(_FACELETS_NAMESPACE_URI);
-    stream.writeCharacters("\n  ");
-  }
-
-  private void _writeEndTagLibrary(
-    XMLStreamWriter stream) throws XMLStreamException
-  {
-
-    stream.writeCharacters("\n");
-    stream.writeEndElement();
-    stream.writeEndDocument();
-  }
-
-  /**
-   * Generates tag library descriptor for parsed component metadata.
-   */
-  private void _writeTag(
-    XMLStreamWriter stream,
-    ComponentBean   component) throws XMLStreamException
-  {
-    stream.writeCharacters("\n  ");
-    stream.writeStartElement("tag");
-    stream.writeCharacters("\n    ");
-    stream.writeStartElement("tag-name");
-    stream.writeCharacters(component.getTagName().getLocalPart());
-    stream.writeEndElement();
-    stream.writeCharacters("\n    ");
-    stream.writeStartElement("component");
-    stream.writeCharacters("\n      ");
-    stream.writeStartElement("component-type");
-    stream.writeCharacters(component.getComponentType());
-    stream.writeEndElement();
-    
-    if (component.getRendererType() != null)
-    {
-      stream.writeCharacters("\n      ");
-      stream.writeStartElement("renderer-type");
-      stream.writeCharacters(component.getRendererType());
-      stream.writeEndElement();
-    }
-    
-    String tagHandler = component.getTagHandler();
-    if (tagHandler == null)
-    {
-      tagHandler = faceletHandlerClass;
-    }
-    if (tagHandler != null)
-    {
-      stream.writeCharacters("\n      ");
-      stream.writeStartElement("handler-class");
-      stream.writeCharacters(tagHandler);
-      stream.writeEndElement();
-    }
-
-    stream.writeCharacters("\n    ");
-    stream.writeEndElement();
-    stream.writeCharacters("\n  ");
-    stream.writeEndElement();
-  }
-
-  /**
-   * Generates tag library descriptor for parsed validator metadata.
-   */
-  private void _writeValidatorTag(
-    XMLStreamWriter stream,
-    ValidatorBean   validator) throws XMLStreamException
-  {
-    stream.writeCharacters("\n  ");
-    stream.writeStartElement("tag");
-    stream.writeCharacters("\n    ");
-    stream.writeStartElement("tag-name");
-    stream.writeCharacters(validator.getTagName().getLocalPart());
-    stream.writeEndElement();
-    stream.writeCharacters("\n    ");
-    stream.writeStartElement("validator");
-    stream.writeCharacters("\n      ");
-    stream.writeStartElement("validator-id");
-    stream.writeCharacters(validator.getValidatorId());
-    stream.writeEndElement();
-
-    stream.writeCharacters("\n    ");
-    stream.writeEndElement();
-    stream.writeCharacters("\n  ");
-    stream.writeEndElement();
-  }
-
-  /**
-   * Generates tag library descriptor for parsed converter metadata.
-   */
-  private void _writeConverterTag(
-    XMLStreamWriter stream,
-    ConverterBean   converter) throws XMLStreamException
-  {
-    stream.writeCharacters("\n  ");
-    stream.writeStartElement("tag");
-    stream.writeCharacters("\n    ");
-    stream.writeStartElement("tag-name");
-    stream.writeCharacters(converter.getTagName().getLocalPart());
-    stream.writeEndElement();
-    stream.writeCharacters("\n    ");
-    stream.writeStartElement("converter");
-    stream.writeCharacters("\n      ");
-    stream.writeStartElement("converter-id");
-    stream.writeCharacters(converter.getConverterId());
-    stream.writeEndElement();
-
-    stream.writeCharacters("\n    ");
-    stream.writeEndElement();
-    stream.writeCharacters("\n  ");
-    stream.writeEndElement();
-  }
-
-
-  /**
-   * @parameter expression="${project}"
-   * @required
-   * @readonly
-   */
-  private MavenProject project;
-
-  /**
-   * @parameter expression="META-INF/maven-faces-plugin/faces-config.xml"
-   * @required
-   * @readonly
-   */
-  private String resourcePath;
-
-  /**
-   * @parameter
-   * @required
-   */
-  private Map taglibs;
-
-
-  /**
-   *@parameter
-   */
-  private String faceletHandlerClass;
-
-  /**
-   * @parameter expression="src/main/conf"
-   * @required
-   */
-  private File configSourceDirectory;
-
-  /**
-   * @parameter expression="${project.build.directory}/maven-faces-plugin/main/resources"
-   * @required
-   */
-  private File generatedResourcesDirectory;
-
-  /**
-   * @parameter
-   */
-  private boolean force;
-
-  static private final String _FACELETS_NAMESPACE_URI =
-              "http://java.sun.com/JSF/Facelet";
-
-  static final private String _FACELETS_TAG_LIBRARY_DOCTYPE_PUBLIC =
-              "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN";
-
-  static final private String _FACELETS_TAG_LIBRARY_DOCTYPE_SYSTEM =
-              "http://java.sun.com/dtd/facelet-taglib_1_0.dtd";
-
-  static final private String _FACELETS_TAG_LIBRARY_DTD =
-    "<!DOCTYPE facelet-taglib PUBLIC \n" +
-    "  \"" + _FACELETS_TAG_LIBRARY_DOCTYPE_PUBLIC + "\"\n" +
-    "  \"" + _FACELETS_TAG_LIBRARY_DOCTYPE_SYSTEM + "\" >\n";
-
-  static final private String _XINCLUDE_FACELETS_TAG_LIBRARY_DTD =
-    "<!DOCTYPE taglib PUBLIC\n" +
-    "  \"" + _FACELETS_TAG_LIBRARY_DOCTYPE_PUBLIC + "\"\n" +
-    "  \"" + _FACELETS_TAG_LIBRARY_DOCTYPE_SYSTEM + "\" [\n" +
-    "      <!ELEMENT xi:include EMPTY>\n" +
-    "      <!ATTLIST xi:include\n" +
-    "          xmlns:xi CDATA #FIXED  \"" + XIncludeFilter.XINCLUDE_NAMESPACE + "\"\n" +
-    "          href     CDATA #IMPLIED\n" +
-    "          xpointer CDATA #IMPLIED>\n" +
-    "]>\n";
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateFacesConfigMojo.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateFacesConfigMojo.java
deleted file mode 100644
index df22420..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateFacesConfigMojo.java
+++ /dev/null
@@ -1,306 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces;
-
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.XIncludeFilter;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-
-import javax.xml.parsers.*;
-import javax.xml.transform.*;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-import java.io.*;
-import java.net.URL;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @version $Id$
- * @requiresDependencyResolution compile
- * @goal generate-faces-config
- * @phase generate-resources
- */
-public class GenerateFacesConfigMojo extends AbstractFacesMojo
-{
-  /**
-   * Execute the Mojo.
-   */
-  public void execute() throws MojoExecutionException
-  {
-    try
-    {
-      // always add resources directory to project resource root
-      addResourceRoot(project, targetDirectory.getCanonicalPath());
-
-      File targetFile = new File(targetDirectory, targetPath);
-
-      URL[] index = readIndex(project);
-
-      if (!force && !isModifiedSince(index, targetFile.lastModified()))
-      {
-        getLog().info("Nothing to generate - " + targetPath + " is up to date");
-      }
-      else
-      {
-        List configURLs = getMasterConfigs(project);
-
-        File configFile = new File(configDirectory, configPath);
-        if (configFile.exists())
-        {
-          configURLs = new LinkedList(configURLs);
-          // base config goes first
-          configURLs.add(0, configFile.toURL());
-        }
-
-        if (!configURLs.isEmpty())
-        {
-          URL baseURL = GenerateFacesConfigMojo.class.getResource("resources/faces-config.xml");
-          DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
-          DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
-          Document document = docBuilder.parse(baseURL.openStream());
-          Element root = document.getDocumentElement();
-
-          // embed each <xi:include> element
-          for (Iterator i = configURLs.iterator(); i.hasNext(); )
-          {
-            URL url = (URL)i.next();
-            Element include = document.createElementNS("http://www.w3.org/2001/XInclude",
-                                                       "xi:include");
-            include.setAttribute("href", url.toExternalForm());
-            include.setAttribute("xpointer", "/faces-config/*");
-            root.insertBefore(include, root.getFirstChild());
-          }
-
-          // Note: use a direct DOM->SAX reader
-          //       rather than transforming to string
-          TransformerFactory transFactory = TransformerFactory.newInstance();
-          Transformer identity = transFactory.newTransformer();
-          ByteArrayOutputStream out = new ByteArrayOutputStream();
-          identity.transform(new DOMSource(document), new StreamResult(out));
-
-          InputStream mergedStream = new ByteArrayInputStream(out.toByteArray());
-          // expand all the xi:include elements
-          SAXParserFactory saxFactory = SAXParserFactory.newInstance();
-          saxFactory.setNamespaceAware(true);
-          saxFactory.setValidating(false);
-          SAXParser saxParser = saxFactory.newSAXParser();
-          XMLReader mergedReader = saxParser.getXMLReader();
-          mergedReader = new XIncludeFilter(mergedReader, baseURL);
-          mergedReader.setEntityResolver(new EntityResolver()
-            {
-              public InputSource resolveEntity(
-                String publicId,
-                String systemId)
-              {
-                return new InputSource(new ByteArrayInputStream(new byte[0]));
-              }
-            });
-          InputSource mergedInput = new InputSource(mergedStream);
-          Source mergedSource = new SAXSource(mergedReader, mergedInput);
-
-          // Transform the combined faces-config.xml file to resolve
-          // component-supertype, inject the DTD and ensure that
-          // metadata is represented compatibly with JSF 1.1 syntax.
-          targetFile.delete();
-          targetFile.getParentFile().mkdirs();
-
-          File tmpFile = null;
-          OutputStream resultStream;
-          if (transformStylesheet != null)
-          {
-            tmpFile = File.createTempFile("generate-faces-config", null);
-            resultStream = new FileOutputStream(tmpFile);
-          }
-          else
-          {
-            resultStream = new FileOutputStream(targetFile);
-          }
-
-          Result mergedResult = new StreamResult(resultStream);
-
-          URL xslURL;
-          if (_is12())
-            xslURL = getClass().getResource("resources/transform12.xsl");
-          else
-            xslURL = getClass().getResource("resources/transform.xsl");
-
-          InputStream xsl = xslURL.openStream();
-          StreamSource xslSource = new StreamSource(xsl);
-          Transformer transformer = transFactory.newTransformer(xslSource);
-          transformer.setParameter("packageContains", packageContains);
-          transformer.setParameter("typePrefix", typePrefix);
-          transformer.setParameter("removeRenderers",
-                                   removeRenderers ? "true" : "false");
-          transformer.setParameter("converterPackageContains", getParameter(converterPackageContains, packageContains));
-          transformer.setParameter("validatorPackageContains", getParameter(validatorPackageContains, packageContains));
-
-          transformer.transform(mergedSource, mergedResult);
-          resultStream.close();
-
-          // OK, if there's a transformSylesheet, we've written
-          // the output to a temporary file, now transform it again.
-          // =-=FIXME AdamWiner:  no, this is not the smartest and
-          // fastest way to do it.  But after finding out
-          // that XMLFilter apparently doesn't support XSL parameters,
-          // and running into a bizarre "illegal processing instruction:
-          // saxon:warning" error message when using chained handlers, I got
-          // tired of trying to be smart.  This is good enough.
-          if (transformStylesheet != null)
-          {
-            StreamSource tmpSource = new StreamSource(tmpFile);
-            StreamSource transformSource = new StreamSource(
-                new File(configDirectory, transformStylesheet));
-            Transformer finalTransform =
-              transFactory.newTransformer(transformSource);
-            FileOutputStream finalOut = new FileOutputStream(targetFile);
-            Result finalResult =
-              new StreamResult(finalOut);
-
-            finalTransform.transform(tmpSource, finalResult);
-            finalOut.close();
-            tmpFile.delete();
-          }
-
-          
-          targetFile.setReadOnly();
-
-          getLog().info("Generated " + targetPath);
-        }
-      }
-    }
-    catch (SAXException e)
-    {
-      throw new MojoExecutionException("Error during generation", e);
-    }
-    catch (TransformerException e)
-    {
-      throw new MojoExecutionException("Error during generation", e);
-    }
-    catch (ParserConfigurationException e)
-    {
-      throw new MojoExecutionException("Error during generation", e);
-    }
-    catch (IOException e)
-    {
-      throw new MojoExecutionException("Error during generation", e);
-    }
-  }
-
-  private boolean _is12()
-  {
-    return "1.2".equals(jsfVersion) || "12".equals(jsfVersion);
-  }
-
-  private String getParameter(String paramName, String defaultValue)
-  {
-    String param;
-
-    if (paramName.length() > 0)
-    {
-       param = paramName;
-    }
-    else
-    {
-        param = defaultValue;
-    }
-    return param;
-  }
-
-  /**
-   * @parameter expression="${project}"
-   * @readonly
-   */
-  private MavenProject project;
-
-  /**
-   * @parameter expression="src/main/conf"
-   * @required
-   */
-  private File configDirectory;
-
-  /**
-   * @parameter
-   */
-  private String configPath = "META-INF/faces-config-base.xml";
-
-  /**
-   * @parameter
-   */
-  private String packageContains = "";
-
-  /**
-   * @parameter
-   */
-  private String converterPackageContains = "";
-
-  /**
-   * @parameter
-   */
-  private String validatorPackageContains = "";
-
-
-  /**
-   * @parameter expression="${project.build.directory}/maven-faces-plugin/main/resources"
-   * @required
-   */
-  private File targetDirectory;
-
-  /**
-   * @parameter
-   */
-  private String targetPath = "META-INF/faces-config.xml";
-
-  /**
-   * @parameter
-   */
-  private boolean force;
-
-  /**
-   * @parameter
-   */
-  private String typePrefix = "";
-
-  /**
-   * Name of an XSLT stylesheet in src/main/conf that will be applied
-   * as the final step.  This can be used to implement any final fixup
-   * of the output.
-   * @parameter
-   */
-  private String transformStylesheet;
-
-  /**
-   * @parameter
-   */
-  private boolean removeRenderers;
-
-  /**
-   * @parameter
-   */
-  private String jsfVersion;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateJspTaglibsMojo.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateJspTaglibsMojo.java
deleted file mode 100644
index 9194b82..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateJspTaglibsMojo.java
+++ /dev/null
@@ -1,1147 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces;
-
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib.AbstractConverterTagGenerator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib.AbstractValidatorTagGenerator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib.ComponentTagGenerator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib.MyFacesComponentTagGenerator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib.MyFacesConverterTagGenerator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib.MyFacesValidatorTagGenerator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib.TagAttributeFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib.TrinidadComponentTagGenerator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib.TrinidadConverterTagGenerator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib.TrinidadValidatorTagGenerator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ComponentBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ConverterBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.FacesConfigBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.MethodSignatureBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ValidatorBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.ComponentFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.ConverterFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.FilteredIterator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.ValidatorFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.XIncludeFilter;
-import org.codehaus.plexus.util.FileUtils;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.stream.XMLOutputFactory;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.stream.StreamResult;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.StringWriter;
-import java.lang.reflect.Modifier;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @version $Id$
- * @requiresDependencyResolution compile
- * @goal generate-jsp-taglibs
- * @phase generate-sources
- */
-public class GenerateJspTaglibsMojo extends AbstractFacesMojo
-{
-  /**
-   * Execute the Mojo.
-   */
-  public void execute() throws MojoExecutionException
-  {
-    try
-    {
-      processIndex(project, resourcePath);
-      _generateTagHandlers();
-      _generateTagLibraryDescriptors();
-    }
-    catch (IOException e)
-    {
-      throw new MojoExecutionException("Error generating components", e);
-    }
-  }
-
-
-  // hook for custom component tag java content
-  protected void writeCustomComponentTagHandlerContent(
-      PrettyWriter  out,
-      ComponentBean component) throws IOException
-  {
-  }
-
-  // hook for custom component tag java imports
-  protected void addCustomComponentTagHandlerImports(
-      Set           imports,
-      ComponentBean component)
-  {
-  }
-
-  // hook for custom component descriptor content
-  protected void writeCustomComponentTagDescriptorContent(
-      XMLStreamWriter  stream,
-      ComponentBean    component)throws XMLStreamException
-  {
-  }
-
-
-  /**
-   * Generates tag library descriptors for parsed component metadata.
-   */
-  private void _generateTagLibraryDescriptors() throws MojoExecutionException
-  {
-    try
-    {
-      // always add resources directory to project resource root
-      addResourceRoot(project, generatedResourcesDirectory.getCanonicalPath());
-
-      // taglibs map syntax requires distinct shortNames,
-      // which is a Good Thing!
-      for (Iterator i = taglibs.entrySet().iterator(); i.hasNext(); )
-      {
-        Map.Entry entry = (Map.Entry)i.next();
-        String shortName = (String)entry.getKey();
-        String namespaceURI = (String)entry.getValue();
-
-        FacesConfigBean facesConfig = getFacesConfig();
-        Iterator components = facesConfig.components();
-        components = new FilteredIterator(components, new SkipFilter());
-        components = new FilteredIterator(components, new ComponentTagLibraryFilter(namespaceURI));
-
-        Iterator validators = facesConfig.validators();
-        validators = new FilteredIterator(validators, new ValidatorTagLibraryFilter(namespaceURI));
-
-        Iterator converters = facesConfig.converters();
-        converters = new FilteredIterator(converters, new ConverterTagLibraryFilter(namespaceURI));
-
-        String targetPath = "META-INF/" + shortName + ".tld";
-        File targetFile = new File(generatedResourcesDirectory, targetPath);
-
-        String configPath = "META-INF/" + shortName + "-base.tld";
-        File configFile = new File(configSourceDirectory, configPath);
-
-        targetFile.delete();
-
-        boolean hasGeneratedTags = (components.hasNext() ||
-                                    converters.hasNext() ||
-                                    validators.hasNext());
-
-        if (hasGeneratedTags && configFile.exists())
-        {
-          ByteArrayOutputStream out = new ByteArrayOutputStream();
-          XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
-          XMLStreamWriter stream = outputFactory.createXMLStreamWriter(out);
-
-          _writeStartTagLibrary(stream, _XINCLUDE_JSP_TAG_LIBRARY_DTD);
-          // base goes first
-          stream.writeStartElement("xi", "include",
-                                   XIncludeFilter.XINCLUDE_NAMESPACE);
-          stream.writeNamespace("xi", XIncludeFilter.XINCLUDE_NAMESPACE);
-          stream.writeAttribute("href", configFile.toURL().toExternalForm());
-          stream.writeAttribute("xpointer", "/taglib/*");
-          stream.writeEndElement();
-          while (components.hasNext())
-          {
-            ComponentBean component = (ComponentBean)components.next();
-            _writeTag(stream, component);
-          }
-          while (converters.hasNext())
-          {
-            ConverterBean converter = (ConverterBean)converters.next();
-            _writeTag(stream, converter);
-          }
-          while (validators.hasNext())
-          {
-            ValidatorBean validator = (ValidatorBean)validators.next();
-            _writeTag(stream, validator);
-          }
-          _writeEndTagLibrary(stream);
-          stream.close();
-
-          InputStream mergedStream = new ByteArrayInputStream(out.toByteArray());
-
-          // expand all the xi:include elements
-          SAXParserFactory saxFactory = SAXParserFactory.newInstance();
-          saxFactory.setNamespaceAware(true);
-          saxFactory.setValidating(false);
-          SAXParser saxParser = saxFactory.newSAXParser();
-          XMLReader mergedReader = saxParser.getXMLReader();
-          mergedReader = new XIncludeFilter(mergedReader, configFile.toURL());
-          // even with validating=false, DTD is still downloaded so that
-          // any entities contained in the document can be expanded.
-          // the following disables that behavior, also saving the time
-          // spent to parse the DTD
-          mergedReader.setEntityResolver(new EntityResolver()
-            {
-              public InputSource resolveEntity(
-                String publicId,
-                String systemId)
-              {
-                return new InputSource(new ByteArrayInputStream(new byte[0]));
-              }
-            });
-          InputSource mergedInput = new InputSource(mergedStream);
-          Source mergedSource = new SAXSource(mergedReader, mergedInput);
-
-          targetFile.delete();
-          targetFile.getParentFile().mkdirs();
-          Result mergedResult = new StreamResult(new FileOutputStream(targetFile));
-
-          TransformerFactory transFactory = TransformerFactory.newInstance();
-          Transformer identity = transFactory.newTransformer();
-          if (!_is12())
-          {
-            identity.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,
-                                       _JSP_TAG_LIBRARY_DOCTYPE_PUBLIC);
-            identity.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,
-                                       _JSP_TAG_LIBRARY_DOCTYPE_SYSTEM);
-          }
-
-          identity.transform(mergedSource, mergedResult);
-
-          targetFile.setReadOnly();
-        }
-        else if (hasGeneratedTags)
-        {
-          targetFile.getParentFile().mkdirs();
-          OutputStream out = new FileOutputStream(targetFile);
-          XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
-          XMLStreamWriter stream = outputFactory.createXMLStreamWriter(out);
-
-          _writeStartTagLibrary(stream, _is12() ? "2.1" : "1.2", shortName, namespaceURI);
-          while (components.hasNext())
-          {
-            ComponentBean component = (ComponentBean)components.next();
-            _writeTag(stream, component);
-          }
-          while (converters.hasNext())
-          {
-            ConverterBean converter = (ConverterBean)converters.next();
-            _writeTag(stream, converter);
-          }
-          while (validators.hasNext())
-          {
-            ValidatorBean validator = (ValidatorBean)validators.next();
-            _writeTag(stream, validator);
-          }
-          _writeEndTagLibrary(stream);
-          stream.close();
-        }
-        else if (configFile.exists())
-        {
-          // copy if newer
-          if (configFile.lastModified() > targetFile.lastModified())
-          {
-            targetFile.delete();
-            targetFile.getParentFile().mkdirs();
-            FileUtils.copyFile(configFile, targetFile);
-            targetFile.setReadOnly();
-          }
-        }
-      }
-    }
-    catch (SAXException e)
-    {
-      throw new MojoExecutionException("Error generating tag library", e);
-    }
-    catch (ParserConfigurationException e)
-    {
-      throw new MojoExecutionException("Error generating tag library", e);
-    }
-    catch (TransformerException e)
-    {
-      throw new MojoExecutionException("Error generating tag library", e);
-    }
-    catch (XMLStreamException e)
-    {
-      throw new MojoExecutionException("Error generating tag library", e);
-    }
-    catch (IOException e)
-    {
-      throw new MojoExecutionException("Error generating tag libraries", e);
-    }
-  }
-
-  private void _writeStartTagLibrary(
-    XMLStreamWriter stream,
-    String          dtd) throws XMLStreamException
-  {
-    stream.writeStartDocument("1.0");
-    stream.writeCharacters("\n");
-    if (!_is12())
-      stream.writeDTD(dtd);
-
-    stream.writeCharacters("\n");
-    stream.writeStartElement("taglib");
-    if (_is12())
-    {
-      stream.writeNamespace("", "http://java.sun.com/xml/ns/javaee");
-      stream.writeNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
-      stream.writeAttribute("xsi:schemaLocation", "http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd");
-      stream.writeAttribute("version", "2.1");
-    }
-
-    stream.writeCharacters("\n  ");
-  }
-
-  private void _writeStartTagLibrary(
-    XMLStreamWriter stream,
-    String          version,
-    String          shortName,
-    String          namespaceURI) throws XMLStreamException
-  {
-    _writeStartTagLibrary(stream, _JSP_TAG_LIBRARY_DTD);
-    stream.writeStartElement("tlib-version");
-    String tlibVersion = project.getVersion();
-    // Remove everything but dewey-decimal characters (i.e., numbers and periods)
-    tlibVersion = tlibVersion.replaceAll("[^.0-9]", "");
-    // Remove leading and/or trailing periods
-    while (tlibVersion.startsWith("."))
-    {
-      tlibVersion = tlibVersion.substring(1);
-    }
-
-    while (tlibVersion.endsWith("."))
-    {
-      tlibVersion = tlibVersion.substring(0, tlibVersion.length() - 1);
-    }
-
-    stream.writeCharacters(tlibVersion);
-    stream.writeEndElement();
-
-    if (!_is12())
-    {
-      stream.writeCharacters("\n  ");
-      stream.writeStartElement("jsp-version");
-      stream.writeCharacters(version);
-      stream.writeEndElement();
-    }
-    stream.writeCharacters("\n  ");
-    stream.writeStartElement("short-name");
-    stream.writeCharacters(shortName);
-    stream.writeEndElement();
-    stream.writeCharacters("\n  ");
-    stream.writeStartElement("uri");
-    stream.writeCharacters(namespaceURI);
-    stream.writeEndElement();
-  }
-
-  private void _writeEndTagLibrary(
-    XMLStreamWriter stream) throws XMLStreamException
-  {
-
-    stream.writeCharacters("\n");
-    stream.writeEndElement();
-    stream.writeEndDocument();
-  }
-
-  /**
-   * Generates tag library descriptor for parsed component metadata.
-   */
-  private void _writeTag(
-    XMLStreamWriter stream,
-    ComponentBean   component) throws XMLStreamException
-  {
-    stream.writeCharacters("\n  ");
-    stream.writeStartElement("tag");
-    stream.writeCharacters("\n    ");
-
-    // In JSP 2.1, description goes up top
-    if (_is12() && component.getDescription() != null)
-    {
-      stream.writeCharacters("\n    ");
-      stream.writeStartElement("description");
-      stream.writeCData(component.getDescription());
-      stream.writeEndElement();
-    }
-
-    stream.writeStartElement("name");
-    stream.writeCharacters(component.getTagName().getLocalPart());
-    stream.writeEndElement();
-    stream.writeCharacters("\n    ");
-    stream.writeStartElement("tag-class");
-    stream.writeCharacters(component.getTagClass());
-    stream.writeEndElement();
-
-    // In JSP 2.1, body-content is not optional
-    if (_is12())
-    {
-      stream.writeCharacters("\n    ");
-      stream.writeStartElement("body-content");
-      stream.writeCharacters("JSP");
-      stream.writeEndElement();
-    }
-
-    GenerateJspTaglibsMojo.this.writeCustomComponentTagDescriptorContent(stream, component);
-
-    // In JSP 2.0, description goes just before the attributes
-    if (!_is12() && component.getDescription() != null)
-    {
-      stream.writeCharacters("\n    ");
-      stream.writeStartElement("description");
-      stream.writeCData(component.getDescription());
-      stream.writeEndElement();
-    }
-
-    Iterator properties = component.properties(true);
-    properties = new FilteredIterator(properties, new TagAttributeFilter());
-    while (properties.hasNext())
-    {
-      PropertyBean property = (PropertyBean)properties.next();
-      writeTagAttribute(stream,
-                         property.getPropertyName(),
-                         property.getDescription(),
-                         property.getUnsupportedAgents(),
-                         property);
-    }
-
-    stream.writeCharacters("\n  ");
-    stream.writeEndElement();
-  }
-
-  /**
-   * Generates tag library descriptor for parsed converter metadata.
-   */
-  private void _writeTag(
-    XMLStreamWriter stream,
-    ConverterBean   converter) throws XMLStreamException
-  {
-    stream.writeCharacters("\n  ");
-    stream.writeStartElement("tag");
-    stream.writeCharacters("\n    ");
-    if (_is12() && converter.getDescription() != null)
-    {
-      stream.writeCharacters("\n    ");
-      stream.writeStartElement("description");
-      stream.writeCData(converter.getDescription());
-      stream.writeEndElement();
-    }
-
-    stream.writeStartElement("name");
-    stream.writeCharacters(converter.getTagName().getLocalPart());
-    stream.writeEndElement();
-    stream.writeCharacters("\n    ");
-    stream.writeStartElement("tag-class");
-    stream.writeCharacters(converter.getTagClass());
-    stream.writeEndElement();
-
-    // In JSP 2.1, body-content is not optional
-    if (_is12())
-    {
-      stream.writeCharacters("\n    ");
-      stream.writeStartElement("body-content");
-      stream.writeCharacters("empty");
-      stream.writeEndElement();
-    }
-
-    if (!_is12() && converter.getDescription() != null)
-    {
-      stream.writeCharacters("\n    ");
-      stream.writeStartElement("description");
-      stream.writeCData(converter.getDescription());
-      stream.writeEndElement();
-    }
-
-    // converters need an id attribute
-    writeTagAttribute(stream, "id", "the identifier for the converter", null, null);
-
-    Iterator properties = converter.properties();
-    properties = new FilteredIterator(properties, new TagAttributeFilter());
-    while (properties.hasNext())
-    {
-      PropertyBean property = (PropertyBean)properties.next();
-      writeTagAttribute(stream,
-                         property.getPropertyName(),
-                         property.getDescription(),
-                         property.getUnsupportedAgents(),
-                         property);
-    }
-
-    stream.writeCharacters("\n  ");
-    stream.writeEndElement();
-  }
-
-  private void _writeTagAttributeDescription(
-    XMLStreamWriter stream,
-    String          description,
-    String[]        unsupportedAgents) throws XMLStreamException
-  {
-
-    if (description != null ||
-        unsupportedAgents.length > 0)
-    {
-      stream.writeCharacters("\n      ");
-      stream.writeStartElement("description");
-
-      if (unsupportedAgents != null &&
-          unsupportedAgents.length > 0)
-      {
-        if (description == null)
-          description = "";
-
-        description += "\n\n    This attribute is not supported on the following agent types:\n";
-
-        for (int i=0; i < unsupportedAgents.length; i++)
-        {
-          description += " " + unsupportedAgents[i];
-          description += (i < unsupportedAgents.length - 1) ? "," : ".";
-        }
-      }
-
-      stream.writeCData(description);
-      stream.writeEndElement();
-    }
-  }
-
-  protected void writeTagAttribute(
-    XMLStreamWriter stream,
-    String          propertyName,
-    String          description,
-    String[]        unsupportedAgents,
-    PropertyBean    property) throws XMLStreamException
-  {
-    stream.writeCharacters("\n    ");
-    stream.writeStartElement("attribute");
-
-    // In JSP 2.1, the description goes at the beginning
-    if (_is12())
-      _writeTagAttributeDescription(stream, description, unsupportedAgents);
-
-    stream.writeCharacters("\n      ");
-    stream.writeStartElement("name");
-    
-    if (property != null)
-      stream.writeCharacters(property.getJspPropertyName());
-    else
-      stream.writeCharacters(propertyName);
-
-    stream.writeEndElement();
-
-    if (!_is12())
-    {
-      if (property != null)
-      {        
-        if (property.isRequired())
-        {
-          stream.writeCharacters("\n    ");
-          stream.writeStartElement("required");
-          stream.writeCharacters("true");
-          stream.writeEndElement();
-        }
-      }
-        
-      stream.writeCharacters("\n      ");
-      stream.writeStartElement("rtexprvalue");
-      stream.writeCharacters("false");
-      stream.writeEndElement();
-      
-      // In JSP 2.0, the tag description goes at the end
-      _writeTagAttributeDescription(stream, description, unsupportedAgents);
-    }
-    else
-    {
-      if (property != null)
-      {
-        if (property.isRequired())
-        {
-          stream.writeCharacters("\n    ");
-          stream.writeStartElement("required");
-          stream.writeCharacters("true");
-          stream.writeEndElement();
-        }
-        
-        if (property.isMethodExpression() || property.isMethodBinding())
-        {
-          stream.writeCharacters("\n    ");
-          stream.writeStartElement("deferred-method");
-          stream.writeCharacters("\n      ");
-          MethodSignatureBean sig = property.getMethodBindingSignature();
-          if (sig != null)
-          {
-            stream.writeStartElement("method-signature");
-            stream.writeCharacters(sig.getReturnType());
-            stream.writeCharacters(" myMethod(");
-            String[] params = sig.getParameterTypes();
-            for (int i = 0; i < params.length; i++)
-            {
-              if (i > 0)
-                stream.writeCharacters(", ");
-              stream.writeCharacters(params[i]);
-            }
-
-            stream.writeCharacters(")");
-            stream.writeEndElement();
-          }
-          stream.writeEndElement();
-        }
-        else if (!property.isLiteralOnly() ||
-                 // "binding" is always a deferred-value
-                 "binding".equals(propertyName))
-        {
-          stream.writeCharacters("\n      ");
-          stream.writeStartElement("deferred-value");
-          String propertyClass = property.getPropertyClass();
-          // Writing java.lang.String is usually a bad idea - it
-          // means that null gets coerced to the empty string.
-          if (("java.lang.String".equals(propertyClass) && coerceStrings) ||
-              _CAN_COERCE.contains(property.getPropertyClass()))
-          {
-            stream.writeCharacters("\n        ");
-            stream.writeStartElement("type");
-            // Trim out any use of generics here - since JSP coercion
-            // certainly can't do anything there
-            int genericIndex = propertyClass.indexOf('<');
-            if (genericIndex > 0)
-              propertyClass = propertyClass.substring(0, genericIndex);
-
-            stream.writeCharacters(propertyClass);
-            stream.writeEndElement();
-            stream.writeCharacters("\n      ");
-          }
-
-          stream.writeEndElement();
-        }
-        else if (property.isRtexprvalue())
-        {
-            stream.writeCharacters("\n      ");
-            stream.writeStartElement("rtexprvalue");
-            stream.writeCharacters("true");
-            stream.writeEndElement();
-        }
-        else
-        {
-          stream.writeCharacters("\n      ");
-          stream.writeStartElement("rtexprvalue");
-          // As of JSF 1.2, "id" can be set via an rtexprvalue (but
-          // *not* by a ValueExpression) - it has to be evaluated
-          // in the JSP
-          if ("id".equals(propertyName) && !disableIdExpressions)
-            stream.writeCharacters("true");
-          else
-            stream.writeCharacters("false");
-          stream.writeEndElement();
-        }
-      }
-    }
-
-    stream.writeCharacters("\n    ");
-    stream.writeEndElement();
-  }
-
-  /**
-   * Generates tag library descriptor for parsed validator metadata.
-   */
-  private void _writeTag(
-    XMLStreamWriter stream,
-    ValidatorBean   validator) throws XMLStreamException
-  {
-    stream.writeCharacters("\n  ");
-    stream.writeStartElement("tag");
-
-    if (_is12() && validator.getDescription() != null)
-    {
-      stream.writeCharacters("\n    ");
-      stream.writeStartElement("description");
-      stream.writeCData(validator.getDescription());
-      stream.writeEndElement();
-    }
-
-    stream.writeCharacters("\n    ");
-    stream.writeStartElement("name");
-    stream.writeCharacters(validator.getTagName().getLocalPart());
-    stream.writeEndElement();
-    stream.writeCharacters("\n    ");
-    stream.writeStartElement("tag-class");
-    stream.writeCharacters(validator.getTagClass());
-    stream.writeEndElement();
-
-    // In JSP 2.1, body-content is not optional
-    if (_is12())
-    {
-      stream.writeCharacters("\n    ");
-      stream.writeStartElement("body-content");
-      stream.writeCharacters("empty");
-      stream.writeEndElement();
-    }
-
-    if (!_is12() && validator.getDescription() != null)
-    {
-      stream.writeCharacters("\n    ");
-      stream.writeStartElement("description");
-      stream.writeCData(validator.getDescription());
-      stream.writeEndElement();
-    }
-
-    // validators need an id attribute
-    writeTagAttribute(stream, "id", "the identifier for the validator", null, null);
-
-    Iterator properties = validator.properties();
-    properties = new FilteredIterator(properties, new TagAttributeFilter());
-    while (properties.hasNext())
-    {
-      PropertyBean property = (PropertyBean)properties.next();
-      writeTagAttribute(stream,
-                         property.getPropertyName(),
-                         property.getDescription(),
-                         property.getUnsupportedAgents(),
-                         property);
-    }
-
-    stream.writeCharacters("\n  ");
-    stream.writeEndElement();
-  }
-
-  /**
-   * Generates tag handlers for parsed component metadata.
-   */
-  private void _generateTagHandlers() throws IOException, MojoExecutionException {
-    // Make sure generated source directory
-    // is added to compilation source path
-    project.addCompileSourceRoot(generatedSourceDirectory.getCanonicalPath());
-
-    FacesConfigBean facesConfig = getFacesConfig();
-    if (!facesConfig.hasComponents() && !facesConfig.hasConverters() && !facesConfig.hasValidators())
-    {
-      getLog().info("Nothing to generate - no components found");
-    }
-    else
-    {
-      Iterator components = facesConfig.components();
-      components = new FilteredIterator(components, new SkipFilter());
-      components = new FilteredIterator(components, new ComponentTagFilter());
-      components = new FilteredIterator(components, new ComponentTagClassFilter(packageContains));
-
-      Iterator validators = facesConfig.validators();
-      validators = new FilteredIterator(validators, new ValidatorTagFilter());
-      validators = new FilteredIterator(validators, new ValidatorTagClassFilter(packageContains));
-
-      Iterator converters = facesConfig.converters();
-      converters = new FilteredIterator(converters, new ConverterTagFilter());
-      converters = new FilteredIterator(converters, new ConverterTagClassFilter(packageContains));
-
-      // incremental unless forced
-      if (!force)
-      {
-        components = new FilteredIterator(components, new IfComponentModifiedFilter());
-        converters = new FilteredIterator(converters, new IfConverterModifiedFilter());
-        validators = new FilteredIterator(validators, new IfValidatorModifiedFilter());
-      }
-
-      if (!components.hasNext() && !converters.hasNext() && !validators.hasNext())
-      {
-        getLog().info("Nothing to generate - all JSP tags are up to date");
-      }
-      else
-      {
-        ComponentTagHandlerGenerator componentGen = new ComponentTagHandlerGenerator();
-        AbstractConverterTagGenerator converterGen = null;
-        AbstractValidatorTagGenerator validatorGen = null;
-        if (type == null || "trinidad".equals(type))
-        {
-          converterGen = new TrinidadConverterTagGenerator(is12(), getLicenseHeader(), getLog());
-          validatorGen = new TrinidadValidatorTagGenerator(is12(), getLicenseHeader(), getLog());
-        }
-        else
-        {
-          converterGen = new MyFacesConverterTagGenerator(is12(), getLicenseHeader(), getLog());
-          validatorGen = new MyFacesValidatorTagGenerator(is12(), getLicenseHeader(), getLog());    
-        }
-        int count = 0;
-        while (components.hasNext())
-        {
-          ComponentBean component = (ComponentBean)components.next();
-          if (!component.isTagClassExcluded())
-          {
-              componentGen.generateTagHandler(component);
-              count++;
-          }
-        }
-        while (converters.hasNext())
-        {
-          ConverterBean converter = (ConverterBean)converters.next();
-          if (!converter.isTagClassExcluded())
-          {
-              converterGen.generateTagHandler(converter, generatedSourceDirectory);
-              count++;
-          }
-        }
-        while (validators.hasNext())
-        {
-          ValidatorBean validator = (ValidatorBean)validators.next();
-          if (!validator.isTagClassExcluded())
-          {
-              validatorGen.generateTagHandler(validator, generatedSourceDirectory);
-              count++;    
-          }          
-        }
-        getLog().info("Generated " + count + " JSP tag(s)");
-      }
-    }
-  }
-
-  class ComponentTagHandlerGenerator
-  {
-    
-    private Set initComponentList(ComponentBean component,
-                                  String fullSuperclassName)
-    {
-      Set componentList = new HashSet();
-      componentList.add(component);
-
-      ComponentBean lBean = component;
-      while ((lBean = lBean.resolveSupertype()) != null &&
-             !fullSuperclassName.equals(lBean.getTagClass()))
-      {
-        getLog().debug(component.getComponentType()+
-                       ": Add additional Tags from: " + lBean.getComponentType());
-        componentList.add(lBean);
-      }
-
-      return componentList;
-    }
-
-    public void generateTagHandler(ComponentBean component)
-    {
-      ComponentTagGenerator generator;
-      Set componentList;
-      
-      String fullSuperclassName = component.findJspTagSuperclass();
-            
-      if (fullSuperclassName == null)
-      {
-        getLog().warn("Missing JSP Tag superclass for component: " + component.getComponentClass()
-                      + ", generation of this Tag is skipped");
-        return;
-      }else{
-          if (is12() && "javax.faces.webapp.UIComponentTag".equalsIgnoreCase(fullSuperclassName)){
-              fullSuperclassName = "javax.faces.webapp.UIComponentELTag";
-          }else if (!is12() && "javax.faces.webapp.UIComponentELTag".equalsIgnoreCase(fullSuperclassName)){
-              fullSuperclassName = "javax.faces.webapp.UIComponentTag";
-          }
-      }
-      
-      componentList = initComponentList(component, fullSuperclassName);
-      
-      String fullClassName = component.getTagClass();
-      try
-      {
-        getLog().debug("Generating " + fullClassName);
-        
-        String sourcePath = Util.convertClassToSourcePath(fullClassName, ".java");
-        File targetFile = new File(generatedSourceDirectory, sourcePath);
-        
-        targetFile.getParentFile().mkdirs();
-        StringWriter sw = new StringWriter();
-        PrettyWriter out = new PrettyWriter(sw);
-        
-        if (component.isTrinidadComponent())
-        {
-          generator = new TrinidadComponentTagGenerator(_is12());
-        }
-        else
-        {
-          generator = new MyFacesComponentTagGenerator(_is12());
-        }
-
-        getLog().debug("Generating " + fullClassName+", with generator: "+generator.getClass().getName());
-
-        String className = Util.getClassFromFullClass(fullClassName);
-        String packageName = Util.getPackageFromFullClass(fullClassName);
-        
-        // header/copyright
-        writePreamble(out);
-        
-        // package
-        out.println("package " + packageName + ";");
-        
-        out.println();
-        
-        String superclassName = Util.getClassFromFullClass(fullSuperclassName);
-        if (superclassName.equals(className))
-        {
-          superclassName = fullSuperclassName;
-        }
-        String componentFullClass = component.getComponentClass();
-        String componentClass = Util.getClassFromFullClass(componentFullClass);
-        
-        generator.writeImports(out, null, packageName, fullSuperclassName, superclassName, componentList);
-        
-        generator.writeClassBegin(out, className, superclassName, component, null);
-        
-        int modifiers = component.getTagClassModifiers();
-        generator.writeConstructor(out, component, modifiers);
-        
-        
-        if (!Modifier.isAbstract(modifiers))
-        {
-          generator.writeGetComponentType(out, component);
-          generator.writeGetRendererType(out, component);
-        }
-
-        GenerateJspTaglibsMojo.this.writeCustomComponentTagHandlerContent(out, component);
-
-        generator.writePropertyMembers(out, componentList);
-        generator.writeSetPropertiesMethod(out, componentClass, componentList);
-        generator.writeReleaseMethod(out, componentList);
-        
-        generator.writeClassEnd(out);
-        out.close();
-        
-        // delay write in case of error
-        // timestamp should not be updated when an error occurs
-        // delete target file first, because it is readonly
-        targetFile.delete();
-        FileWriter fw = new FileWriter(targetFile);
-        StringBuffer buf = sw.getBuffer();
-        fw.write(buf.toString());
-        fw.close();
-        targetFile.setReadOnly();
-      }
-      catch (Throwable e)
-      {
-        getLog().error("Error generating " + fullClassName, e);
-      }
-    }
-  }
-
-  protected boolean is12()
-  {
-    return "1.2".equals(jsfVersion) || "12".equals(jsfVersion);
-  }
-
-  private boolean _is12()
-  {
-    return is12();
-  }
-
-  private class IfComponentModifiedFilter extends ComponentFilter
-  {
-    protected boolean accept(
-      ComponentBean component)
-    {
-      String tagClass = component.getTagClass();
-      String sourcePath = Util.convertClassToSourcePath(tagClass, ".java");
-      String templatePath = Util.convertClassToSourcePath(tagClass, "Template.java");
-      File targetFile = new File(generatedSourceDirectory, sourcePath);
-      File templateFile = new File(templateSourceDirectory, templatePath);
-
-      // accept if templateFile is newer or component has been modified
-      return (templateFile.lastModified() > targetFile.lastModified() ||
-              component.isModifiedSince(targetFile.lastModified()));
-    }
-  }
-
-  private class IfConverterModifiedFilter extends ConverterFilter
-  {
-    protected boolean accept(
-      ConverterBean converter)
-    {
-      String tagClass = converter.getTagClass();
-      String sourcePath = Util.convertClassToSourcePath(tagClass, ".java");
-      String templatePath = Util.convertClassToSourcePath(tagClass, "Template.java");
-      File targetFile = new File(generatedSourceDirectory, sourcePath);
-      File templateFile = new File(templateSourceDirectory, templatePath);
-
-      // accept if templateFile is newer or component has been modified
-      return (templateFile.lastModified() > targetFile.lastModified() ||
-              converter.isModifiedSince(targetFile.lastModified()));
-    }
-  }
-
-  private class IfValidatorModifiedFilter extends ValidatorFilter
-  {
-    protected boolean accept(
-      ValidatorBean validator)
-    {
-      String tagClass = validator.getTagClass();
-      String sourcePath = Util.convertClassToSourcePath(tagClass, ".java");
-      String templatePath = Util.convertClassToSourcePath(tagClass, "Template.java");
-      File targetFile = new File(generatedSourceDirectory, sourcePath);
-      File templateFile = new File(templateSourceDirectory, templatePath);
-
-      // accept if templateFile is newer or component has been modified
-      return (templateFile.lastModified() > targetFile.lastModified() ||
-              validator.isModifiedSince(targetFile.lastModified()));
-    }
-  }
-
-  /**
-   * @parameter expression="${project}"
-   * @required
-   * @readonly
-   */
-  protected MavenProject project;
-
-  /**
-   * @parameter
-   * @required
-   */
-  protected Map taglibs;
-
-  /**
-   * @parameter expression="META-INF/maven-faces-plugin/faces-config.xml"
-   * @required
-   * @readonly
-   */
-  protected String resourcePath;
-
-  /**
-   * @parameter expression="src/main/conf"
-   * @required
-   */
-  protected File configSourceDirectory;
-
-  /**
-   * @parameter expression="src/main/java-templates"
-   * @required
-   */
-  protected File templateSourceDirectory;
-
-  /**
-   * @parameter expression="${project.build.directory}/maven-faces-plugin/main/java"
-   * @required
-   */
-  protected File generatedSourceDirectory;
-
-  /**
-   * @parameter expression="${project.build.directory}/maven-faces-plugin/main/resources"
-   * @required
-   */
-  protected File generatedResourcesDirectory;
-
-  /**
-   * @parameter
-   */
-  protected String packageContains = "";
-
-  /**
-   * @parameter
-   */
-  protected boolean force;
-
-
-  /**
-   * @parameter
-   */
-  protected boolean disableIdExpressions;
-
-  /**
-   * @parameter
-   */
-  protected boolean coerceStrings;
-
-  
-  /**
-   * @parameter
-   */
-  private String jsfVersion;
-
-  /**
-   * @parameter expression="trinidad"
-   */
-  private String type;
-
-
-
-  static final private String _JSP_TAG_LIBRARY_DOCTYPE_PUBLIC =
-              "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN";
-
-  static final private String _JSP_TAG_LIBRARY_DOCTYPE_SYSTEM =
-              "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd";
-
-  static final private String _JSP_TAG_LIBRARY_DTD =
-    "<!DOCTYPE taglib PUBLIC \n" +
-    "  \"" + _JSP_TAG_LIBRARY_DOCTYPE_PUBLIC + "\"\n" +
-    "  \"" + _JSP_TAG_LIBRARY_DOCTYPE_SYSTEM + "\" >\n";
-
-  static final private String _XINCLUDE_JSP_TAG_LIBRARY_DTD =
-    "<!DOCTYPE taglib PUBLIC\n" +
-    "  \"" + _JSP_TAG_LIBRARY_DOCTYPE_PUBLIC + "\"\n" +
-    "  \"" + _JSP_TAG_LIBRARY_DOCTYPE_SYSTEM + "\" [\n" +
-    "      <!ELEMENT xi:include EMPTY>\n" +
-    "      <!ATTLIST xi:include\n" +
-    "          xmlns:xi CDATA #FIXED  \"" + XIncludeFilter.XINCLUDE_NAMESPACE + "\"\n" +
-    "          href     CDATA #IMPLIED\n" +
-    "          xpointer CDATA #IMPLIED>\n" +
-    "]>\n";
-
-  static final private Set _CAN_COERCE = new HashSet();
-  static
-  {
-    // What?  Can't coerce Strings?  How could that be?  Well, take a look at:
-    //   http://issues.apache.org/jira/browse/ADFFACES-377
-    // The silly coercion rules in JSP convert null to the
-    // empty string.  So it's not that we can't coerce to
-    // String, we just really, really don't want to.
-    //    _CAN_COERCE.add("java.lang.String");
-    // TODO: consider getting rid of coercion rules for
-    // all non-primitives
-    _CAN_COERCE.add("java.lang.Integer");
-    _CAN_COERCE.add("java.lang.Long");
-    _CAN_COERCE.add("java.lang.Boolean");
-    _CAN_COERCE.add("java.lang.Double");
-    _CAN_COERCE.add("java.lang.Float");
-    _CAN_COERCE.add("java.lang.Short");
-    _CAN_COERCE.add("java.lang.Character");
-    _CAN_COERCE.add("java.lang.Byte");
-    _CAN_COERCE.add("int");
-    _CAN_COERCE.add("long");
-    _CAN_COERCE.add("boolean");
-    _CAN_COERCE.add("double");
-    _CAN_COERCE.add("float");
-    _CAN_COERCE.add("short");
-    _CAN_COERCE.add("char");
-    _CAN_COERCE.add("byte");
-
-    // See http://issues.apache.org/jira/browse/ADFFACES-477:  for
-    // "binding" and "converter" properties, we want the deferred-types
-    // there.  Hardcoding these here is very ugly, but putting in
-    // all coercion rules would break how Trinidad handles Dates,
-    // and Lists of Colors, etc. - for those, we want to support
-    // raw Strings (which the JSP engine doesn't know how to coerce)
-    // and coerce them ourselves in the tag.
-    _CAN_COERCE.add("javax.faces.component.UIComponent");
-    _CAN_COERCE.add("javax.faces.convert.Converter");
-  }
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateMasterFacesConfigMojo.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateMasterFacesConfigMojo.java
deleted file mode 100644
index 5d65d60..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateMasterFacesConfigMojo.java
+++ /dev/null
@@ -1,214 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.HashSet;
-
-import javax.xml.stream.XMLOutputFactory;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-
-import org.apache.maven.plugin.MojoExecutionException;
-
-import org.apache.maven.project.MavenProject;
-import org.codehaus.plexus.util.DirectoryScanner;
-
-/**
- * @version $Id$
- * @requiresDependencyResolution compile
- * @goal generate-master-faces-config
- * @phase generate-resources
- */
-public class GenerateMasterFacesConfigMojo extends AbstractFacesMojo
-{
-  /**
-   * Execute the Mojo.
-   */
-  public void execute() throws MojoExecutionException
-  {
-    try
-    {
-      addResourceRoot(project, targetDirectory.getCanonicalPath());
-
-      // Scan for .xrts sources
-      String [] xmlFiles;
-      
-      if (inheritedDirectory != null)
-      {
-          HashSet set = new HashSet();
-         
-          DirectoryScanner scanner = new DirectoryScanner();
-          scanner.setBasedir(new File(sourceDirectory, sourcePath));
-          scanner.addDefaultExcludes();
-          scanner.setIncludes(new String[] { "**/*.xml" });
-          if (excludes != null)
-          {
-              scanner.setExcludes(excludes);
-          }
-          scanner.scan();
-          
-          String [] sourceFiles = scanner.getIncludedFiles();
-          
-          for (int i = 0; i < sourceFiles.length;i++)
-          {
-              set.add(sourceFiles[i]);
-          }
-          
-          scanner.setBasedir(new File(inheritedDirectory,sourcePath));
-          scanner.scan();
-          
-          sourceFiles = scanner.getIncludedFiles();
-          for (int i = 0; i < sourceFiles.length;i++)
-          {
-              set.add(sourceFiles[i]);
-          }          
-                    
-          Object [] result = set.toArray();
-          xmlFiles = new String[result.length];
-          for (int i = 0; i < result.length; i++)
-          {
-              xmlFiles[i] = (String) result[i];
-          }
-      }
-      else
-      {
-          DirectoryScanner scanner = new DirectoryScanner();
-          scanner.setBasedir(new File(sourceDirectory, sourcePath));
-          scanner.addDefaultExcludes();
-          scanner.setIncludes(new String[] { "**/*.xml" });
-          if (excludes != null)
-          {
-              scanner.setExcludes(excludes);
-          }
-          scanner.scan();
-          
-          xmlFiles = scanner.getIncludedFiles();
-      }
-
-      
-
-      long lastModified = 0L;
-      for (int i=0; i < xmlFiles.length; i++)
-      {
-        lastModified = Math.max(lastModified,
-                                new File(xmlFiles[i]).lastModified());
-      }
-
-      File targetFile = new File(targetDirectory, targetPath);
-
-      if (!force && targetFile.lastModified() > lastModified)
-      {
-        getLog().info("Nothing to generate - " + targetPath + " is up to date");
-      }
-      else
-      {
-        getLog().info("Generating " + targetPath);
-
-        targetFile.delete();
-        targetFile.getParentFile().mkdirs();
-
-        OutputStream out = new BufferedOutputStream(new FileOutputStream(targetFile));
-        XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
-        XMLStreamWriter writer =  outputFactory.createXMLStreamWriter(out);
-        writer.writeStartDocument("1.0");
-        writer.writeCharacters("\n");
-        writer.writeStartElement("faces-config");
-        writer.writeDefaultNamespace("http://java.sun.com/xml/ns/javaee");
-        writer.writeNamespace("xi", "http://www.w3.org/2001/XInclude");
-        writer.writeCharacters("\n");
-        for (int i=0; i < xmlFiles.length; i++)
-        {
-          String xmlFile = xmlFiles[i];
-          if (File.separatorChar == '\\')
-          {
-            xmlFile = xmlFile.replaceAll("\\\\", "/");
-          }
-          writer.writeCharacters("  ");
-          writer.writeStartElement("http://www.w3.org/2001/XInclude", "include");
-          writer.writeAttribute("href", xmlFile);
-          writer.writeAttribute("xpointer", "/faces-config/*");
-          writer.writeEndElement();
-          writer.writeCharacters("\n");
-        }
-        writer.writeEndDocument();
-        writer.close();
-
-        targetFile.setReadOnly();
-      }
-    }
-    catch (XMLStreamException e)
-    {
-      throw new MojoExecutionException("Error during generation", e);
-    }
-    catch (IOException e)
-    {
-      throw new MojoExecutionException("Error during generation", e);
-    }
-  }
-
-  /**
-   * @parameter expression="${project}"
-   * @readonly
-   */
-  private MavenProject project;
-
-  /**
-   * @parameter
-   */
-  private String[] excludes;
-
- /**
-   * @parameter expression="META-INF/maven-faces-plugin";
-   * @required
-   */
-  private String sourcePath;
-
-  /**
-   * @parameter expression="src/main/resources"
-   * @required
-   */
-  private File sourceDirectory;
-  
-  /**
-   * @parameter 
-   */  
-  private File inheritedDirectory;
-  
-  /**
-   * @parameter
-   * @readonly
-   */
-  private String targetPath = "META-INF/maven-faces-plugin/faces-config.xml";
-
-  /**
-   * @parameter expression="${project.build.directory}/maven-faces-plugin/main/resources"
-   * @required
-   */
-  private File targetDirectory;
-
-  /**
-   * @parameter
-   */
-  private boolean force;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateRendererMapMojo.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateRendererMapMojo.java
deleted file mode 100644
index 077c2c5..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateRendererMapMojo.java
+++ /dev/null
@@ -1,136 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Iterator;
-
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.FacesConfigBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.RenderKitBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.RendererBean;
-
-/**
- * @version $Id$
- * @requiresDependencyResolution compile
- * @goal generate-renderer-map
- * @phase generate-sources
- */
-public class GenerateRendererMapMojo extends AbstractFacesMojo
-{
-  /**
-   * Execute the Mojo.
-   */
-  public void execute() throws MojoExecutionException
-  {
-    try
-    {
-      processIndex(project, resourcePath);
-      _generateRendererMap();
-    }
-    catch (IOException e)
-    {
-      throw new MojoExecutionException("Error generating components", e);
-    }
-  }
-
-  /**
-   * Generates parsed components.
-   */
-  private void _generateRendererMap() throws IOException
-  {
-    // Make sure generated source directory
-    // is added to compilation source path
-    project.addCompileSourceRoot(generatedSourceDirectory.getCanonicalPath());
-
-    FacesConfigBean facesConfig = getFacesConfig();
-    if (!facesConfig.hasRenderKits())
-    {
-      getLog().info("Nothing to generate - no renderkits found");
-    }
-    else
-    {
-      Iterator renderkits = facesConfig.renderKits();
-      while (renderkits.hasNext())
-      {
-        RenderKitBean renderkit = (RenderKitBean) renderkits.next();
-        String id = renderkit.getRenderKitId();
-        if (!id.startsWith(renderKitPrefix))
-        {
-          continue;
-        }
-
-        _writeRenderKitMap(renderkit);
-      }
-    }
-  }
-
-  private void _writeRenderKitMap(RenderKitBean rk) throws IOException
-  {
-    File outFile = new File(generatedSourceDirectory,
-                            "/META-INF/" + rk.getRenderKitId() + ".renderkit");
-    FileWriter fw = new FileWriter(outFile);
-    PrintWriter pw = new PrintWriter(fw);
-    try
-    {
-      Iterator renderers = rk.renderers();
-      while (renderers.hasNext())
-      {
-        RendererBean r = (RendererBean) renderers.next();
-        pw.print(r.getComponentFamily());
-        pw.print('|');
-        pw.print(r.getRendererType());
-        pw.print('=');
-        pw.println(r.getRendererClass());
-      }
-    }
-    finally
-    {
-      pw.close();
-    }
-  }
-
-  /**
-   * @parameter expression="${project}"
-   * @readonly
-   */
-  private MavenProject project;
-
-  /**
-   * @parameter
-   * @readonly
-   */
-  private String resourcePath = "META-INF/maven-faces-plugin/index.lst";
-
-  /**
-   * @parameter expression="${project.build.directory}/maven-faces-plugin/main/resources"
-   * @required
-   */
-  private File generatedSourceDirectory;
-
-  /**
-   * @parameter
-   * @required
-   */
-  private String renderKitPrefix;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/ClassGenerator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/ClassGenerator.java
deleted file mode 100644
index b8d8f50..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/ClassGenerator.java
+++ /dev/null
@@ -1,67 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ComponentBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.SourceTemplate;
-
-import java.io.IOException;
-import java.util.Collection;
-
-/**
- * Generator
- *
- * @author Bruno Aranda (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-public interface ClassGenerator
-{
-  void writeImports(
-      PrettyWriter out,
-      SourceTemplate template,
-      String packageName,
-      String fullSuperclassName,
-      String superclassName,
-      ComponentBean component);
-
-  void writeImports(
-      PrettyWriter out,
-      SourceTemplate template,
-      String packageName,
-      String fullSuperclassName,
-      String superclassName,
-      Collection components);
-
-  void writeClassBegin(
-      PrettyWriter out,
-      String className,
-      String superclassName,
-      ComponentBean component,
-      SourceTemplate template);
-
-  void writeConstructor(
-      PrettyWriter out,
-      ComponentBean component,
-      int modifiers) throws IOException;
-
-  void writeClassEnd(
-      PrettyWriter out);
-
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/GeneratorHelper.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/GeneratorHelper.java
deleted file mode 100644
index cab6d5d..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/GeneratorHelper.java
+++ /dev/null
@@ -1,168 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Filter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.FilteredIterator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * TODO: comment this!
- *
- * @author Bruno Aranda (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-public class GeneratorHelper
-{
-  private GeneratorHelper()
-  {
-  }
-
-  public static boolean isConverter(
-      String propClass)
-  {
-    return ("javax.faces.convert.Converter".equals(propClass));
-  }
-
-  public static boolean isKeyStroke(
-      String propClass)
-  {
-    return ("javax.swing.KeyStroke".equals(propClass));
-  }
-
-  public static boolean isAWTKeyStroke(
-      String propClass)
-  {
-    return ("java.awt.AWTKeyStroke".equals(propClass));
-  }
-
-  public static boolean isNumber(
-      String propClass)
-  {
-    return ("java.lang.Number".equals(propClass));
-  }
-
-  public static boolean isColorList(
-      String propClass,
-      String[] propClassParams)
-  {
-    return ("java.util.List".equals(propClass) &&
-        propClassParams.length == 1 &&
-        "java.awt.Color".equals(propClassParams[0]));
-  }
-
-  public static boolean isColor(
-      String propClass)
-  {
-    return ("java.awt.Color".equals(propClass));
-  }  
-
-  public static boolean isAction(PropertyBean property)
-  {
-    return (property.getClass().equals("javax.el.MethodExpression")
-        && property.getJspPropertyName().equals("action"));
-  }
-
-  public static boolean isActionListener(PropertyBean property, boolean is12)
-  {
-    return (property.getJspPropertyName().equals("actionListener") &&
-        ((property.isMethodExpression()) || (is12 && property.isMethodBinding())));
-  }
-
-  public static boolean isValueChangeListener(PropertyBean property, boolean is12)
-  {
-    return (property.getJspPropertyName().equals("valueChangeListener") &&
-        ((property.isMethodExpression()) || (is12 && property.isMethodBinding())));
-  }
-
-  public static boolean isValidator(PropertyBean property, boolean is12)
-  {
-    return (property.getJspPropertyName().equals("validator")) &&
-        ((property.isMethodExpression()) || (is12 && property.isMethodBinding()));
-  }
-
-  static public void writeImports(
-      PrettyWriter out,
-      String packageName,
-      Set imports)
-  {
-    Iterator iterator = imports.iterator();
-    iterator = new FilteredIterator(iterator,
-        new PackageImportsFilter(packageName));
-    while (iterator.hasNext())
-    {
-      String className = (String) iterator.next();
-      out.println("import " + className + ";");
-    }
-
-    out.println();
-  }
-
-  public static class PackageImportsFilter implements Filter
-  {
-    public PackageImportsFilter(
-        String packageName)
-    {
-      _packageName = packageName;
-    }
-
-    public boolean accept(
-        Object object)
-    {
-      String className = (String) object;
-      String packageName = Util.getPackageFromFullClass(className);
-      return (!packageName.equals(_packageName) &&
-          !packageName.equals("java.lang"));
-    }
-
-    private final String _packageName;
-  }
-
-  public static String getJspPropertyType(PropertyBean property, boolean is12)
-  {
-    if (property.isMethodExpression())
-    {
-      return "MethodExpression";
-    }
-
-    if (is12 && property.isMethodBinding())
-    {
-      return "MethodExpression";
-    }
-
-    if (is12)
-    {
-      if (!property.isLiteralOnly())
-      {
-        return "ValueExpression";
-      }
-      else
-      {
-        return property.getPropertyClass();
-      }
-    }
-
-    return "String";
-  }
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/component/AbstractComponentGenerator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/component/AbstractComponentGenerator.java
deleted file mode 100644
index cc69fd3..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/component/AbstractComponentGenerator.java
+++ /dev/null
@@ -1,1058 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.component;
-
-import org.apache.maven.plugin.logging.Log;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.GeneratorHelper;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.*;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.FilteredIterator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.PropertyFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.SourceTemplate;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-
-import java.io.IOException;
-import java.lang.reflect.Modifier;
-import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public abstract class AbstractComponentGenerator implements ComponentGenerator
-{
-
-  private Log _log;
-  boolean _is12;
-
-  public AbstractComponentGenerator(Log log, boolean is12)
-  {
-    _log = log;
-    _is12 = is12;
-  }
-
-  protected Log getLog()
-  {
-    return _log;
-  }
-
-  public void writeClassBegin(
-      PrettyWriter out,
-      String className,
-      String superclassName,
-      ComponentBean component,
-      SourceTemplate template)
-  {
-    out.println("/**");
-
-    // TODO: restore description (needs escaping?)
-//    String description = component.getDescription();
-//    if (description != null)
-//    {
-//      out.println(" *");
-//      out.println(" * " + convertMultilineComment(description));
-//    }
-
-    String longDescription = component.getLongDescription();
-    if (longDescription != null)
-    {
-      out.println(" *");
-      out.println(" * " + convertMultilineComment(longDescription));
-    }
-
-    if (component.hasEvents(true))
-    {
-      // the events javadoc
-      out.println(" *");
-      out.println(" * <h4>Events:</h4>");
-      out.println(" * <table border=\"1\" width=\"100%\" cellpadding=\"3\" summary=\"\">");
-      out.println(" * <tr bgcolor=\"#CCCCFF\" class=\"TableHeadingColor\">");
-      out.println(" * <th align=\"left\">Type</th>");
-      out.println(" * <th align=\"left\">Phases</th>");
-      out.println(" * <th align=\"left\">Description</th>");
-      out.println(" * </tr>");
-      Iterator events = component.events(true);
-      while (events.hasNext())
-      {
-        EventRefBean eventRef = (EventRefBean) events.next();
-        EventBean event = eventRef.resolveEventType();
-        if (event != null)
-        {
-          String eventClass = event.getEventClass();
-          String[] eventPhases = eventRef.getEventDeliveryPhases();
-          String eventDescription = event.getDescription();
-          out.println(" * <tr class=\"TableRowColor\">");
-          out.println(" * <td valign=\"top\"><code>" + eventClass + "</code></td>");
-          out.print(" * <td valign=\"top\" nowrap>");
-          if (eventPhases != null)
-          {
-            for (int i = 0; i < eventPhases.length; i++)
-            {
-              if (i > 0)
-                out.print("<br>");
-              out.print(eventPhases[i]);
-            }
-          }
-          out.println("</td>");
-          out.println(" * <td valign=\"top\">" + eventDescription + "</td>");
-          out.println(" * </tr>");
-        }
-      }
-      out.println(" * </table>");
-    }
-
-    if (!component.hasChildren())
-    {
-      out.println(" * <p>");
-      out.println(" * It does not support any children.");
-    }
-
-    out.println(" */");
-
-    // TODO: eliminate <mfp:component-class-modifier> metadata
-    int modifiers = component.getComponentClassModifiers();
-    String classStart = Modifier.toString(modifiers);
-    // TODO: use canonical ordering
-    classStart = classStart.replaceAll("public abstract", "abstract public");
-    out.println(classStart + " class " + className +
-        " extends " + superclassName);
-
-    Set interfaces = new HashSet();
-    if (template != null)
-      interfaces.addAll(template.getImplements());
-
-    if (component.getComponentImplements() != null){
-        StringTokenizer st = new StringTokenizer(component.getComponentImplements(),",",false);
-        while (st.hasMoreTokens()){
-            interfaces.add(st.nextToken());    
-        }        
-    }
-    
-    if (component.isNamingContainer())
-      interfaces.add("javax.faces.component.NamingContainer");
-
-    Iterator events = component.events();
-    while (events.hasNext())
-    {
-      EventRefBean eventRef = (EventRefBean) events.next();
-      EventBean event = eventRef.resolveEventType();
-      if (event != null)
-      {
-        if (!eventRef.isIgnoreSourceInterface())
-        {
-          String source = event.getEventSourceInterface();
-          if (source != null)
-            interfaces.add(Util.getClassFromFullClass(source));
-        }
-      }
-    }
-
-    if (!interfaces.isEmpty())
-    {
-      Set implementsSet = new HashSet();
-      for (Iterator iter = interfaces.iterator(); iter.hasNext();)
-      {
-        String fcqn = (String) iter.next();
-        implementsSet.add(Util.getClassFromFullClass(fcqn));
-      }
-
-      // implements clause spans multiple lines
-      char[] indent = new char[classStart.length() +
-          " class ".length() +
-          className.length() + 1];
-      Arrays.fill(indent, ' ');
-      out.print(indent);
-      out.print("implements ");
-      for (Iterator iter = implementsSet.iterator(); iter.hasNext();)
-      {
-        out.print((String) iter.next());
-        if (iter.hasNext())
-        {
-          out.println(",");
-          out.print(indent);
-          out.print("           ");  // same length as "implements "
-        }
-      }
-      out.println();
-    }
-
-    out.println("{");
-    out.indent();
-    
-    //Write serialVersionUID
-    if (component.getComponentSerialUID() != null &&
-            !"".equals(component.getComponentSerialUID())){
-        out.println();
-        out.println("private static final long serialVersionUID = "+
-                component.getComponentSerialUID()+";");
-        out.println();
-    }
-  }
-
-  public void writeClassEnd(
-      PrettyWriter out)
-  {
-    out.unindent();
-    out.println("}");
-  }
-
-
-  public void writeImports(PrettyWriter out, SourceTemplate template, String packageName, String fullSuperclassName,
-                           String superclassName, Collection components)
-  {
-    throw new UnsupportedOperationException("not implemented");
-  }
-
-  public void writeImports(
-      PrettyWriter out,
-      SourceTemplate template,
-      String packageName,
-      String fullSuperclassName,
-      String superclassName,
-      ComponentBean component)
-  {
-    Set imports = new TreeSet();
-
-    // Use the template imports
-    if (template != null)
-      imports.addAll(template.getImports());
-
-    if (component.getComponentImplements() != null){
-        StringTokenizer st = new StringTokenizer(component.getComponentImplements(),",",false);
-        while (st.hasMoreTokens()){
-            imports.add(st.nextToken());    
-        }        
-    }    
-    
-    // Detect NamingContainer
-    if (component.isNamingContainer())
-      imports.add("javax.faces.component.NamingContainer");
-
-    Iterator properties = component.properties();
-    properties = new FilteredIterator(properties, new NonVirtualFilter());
-    // PropertyKey only needed if there are properties
-    if (properties.hasNext())
-    {
-      while (properties.hasNext())
-      {
-        PropertyBean property = (PropertyBean) properties.next();
-        String propertyClass = property.getPropertyClass();
-        if (propertyClass != null)
-        {
-          imports.add(propertyClass);
-          // Check for generics
-          String[] types = property.getAttributeClassParameters();
-          if (types != null)
-          {
-            for (int i = types.length - 1; i >= 0; i--)
-            {
-              addGenericImports(imports, types[i]);
-            }
-          }
-        }
-      }
-    }
-
-    Iterator facets = component.facets();
-    // UIComponent needed if there are facets
-    if (facets.hasNext())
-      imports.add("javax.faces.component.UIComponent");
-
-    Iterator events = component.events();
-    while (events.hasNext())
-    {
-      EventRefBean eventRef = (EventRefBean) events.next();
-      EventBean event = eventRef.resolveEventType();
-
-      if (event == null)
-      {
-        getLog().warn("Unknown event type \"" + eventRef.getEventType() + "\"" +
-            " in component:" + component.getComponentType());
-      }
-      else
-      {
-        String listenerClass = event.getEventListenerClass();
-        if (listenerClass != null)
-          imports.add(listenerClass);
-
-        if (!eventRef.isIgnoreSourceInterface())
-        {
-          String sourceInterface = event.getEventSourceInterface();
-          if (sourceInterface != null)
-            imports.add(sourceInterface);
-        }
-      }
-    }
-
-    // Import causes a collision if className and superclassName are equal
-    if (!superclassName.equals(fullSuperclassName))
-    {
-      String superPackageName = Util.getPackageFromFullClass(fullSuperclassName);
-      // component superclass only needed if not in
-      // same package as component class
-      if (superPackageName != packageName)
-        imports.add(fullSuperclassName);
-    }
-
-    // add other imports (generator specific)
-    addSpecificImports(imports, component);
-
-    // do not import implicit types!
-    imports.removeAll(Util.PRIMITIVE_TYPES);
-
-    GeneratorHelper.writeImports(out, packageName, imports);
-  }
-
-  protected void addSpecificImports(
-      Set imports,
-      ComponentBean component)
-  {
-    // nothing by default
-  }
-
-  public void addGenericImports(Set imports, String type)
-  {
-    Matcher matcher = _GENERIC_TYPE.matcher(type);
-    if (matcher.matches())
-    {
-      // Generic type
-      imports.add(matcher.group(1));
-      String[] types = matcher.group(2).split(",");
-      for (int i = types.length - 1; i >= 0; i--)
-      {
-        addGenericImports(imports, types[i]);
-      }
-    }
-    else
-    {
-      // Non-generic type
-      imports.add(type);
-    }
-  }
-
-  public void writeGenericConstants(
-      PrettyWriter out,
-      String componentFamily,
-      String componentType) throws IOException
-  {
-    out.println();
-    out.println("static public final String COMPONENT_FAMILY =");
-    out.println("  \"" + componentFamily + "\";");
-    out.println("static public final String COMPONENT_TYPE =");
-    out.println("  \"" + componentType + "\";");
-  }
-
-  public void writePropertyConstants(
-      PrettyWriter out,
-      String superclassName,
-      ComponentBean component) throws IOException
-  {
-    // nothing
-  }
-
-  public void writePropertyValueConstants(
-      PrettyWriter out,
-      ComponentBean component) throws IOException
-  {
-    //  component property keys
-    Iterator properties = component.properties();
-    properties = new FilteredIterator(properties, new NonVirtualFilter());
-    while (properties.hasNext())
-    {
-      PropertyBean property = (PropertyBean) properties.next();
-      String[] propertyValues = property.getPropertyValues();
-
-      if (propertyValues != null)
-      {
-        String propName = property.getPropertyName();
-
-        for (int i = 0; i < propertyValues.length; i++)
-        {
-          String propValue = propertyValues[i];
-          String propValueName = propName +
-              Character.toUpperCase(propValue.charAt(0)) +
-              propValue.substring(1);
-          String propValueKey = Util.getConstantNameFromProperty(propValueName);
-
-          out.println("static public final String " + propValueKey + " = \"" + propValue + "\";");
-        }
-
-      }
-    }
-  }
-
-  public void writeFacetConstants(
-      PrettyWriter out,
-      ComponentBean component) throws IOException
-  {
-    Iterator facets = component.facets();
-    while (facets.hasNext())
-    {
-      FacetBean facet = (FacetBean) facets.next();
-      String facetName = facet.getFacetName();
-      String facetKey = Util.getConstantNameFromProperty(facetName, "_FACET");
-      out.println("static public final " +
-          "String " + facetKey + " = \"" + facetName + "\";");
-    }
-  }
-
-  protected String convertStringToBoxedLiteral(
-      String className,
-      String value)
-  {
-    if (value == null)
-    {
-      return null;
-    }
-    else if ("String".equals(className))
-    {
-      return "\"" + value.replaceAll("\'", "\\'") + "\"";
-    }
-    else if ("boolean".equals(className))
-    {
-      return ("true".equals(value)) ? "Boolean.TRUE" : "Boolean.FALSE";
-    }
-    else if ("char".equals(className))
-    {
-      return "Character.valueOf('" + value.replaceAll("\'", "\\'") + "')";
-    }
-    else if ("int".equals(className))
-    {
-      return "Integer.valueOf(" + value + ")";
-    }
-    else if ("double".equals(className))
-    {
-      return "Double.valueOf(" + value + ")";
-    }
-    else if ("float".equals(className))
-    {
-      return "Float.valueOf(" + value + ")";
-    }
-    else if ("Number".equals(className))
-    {
-      if(value.indexOf(".") == -1)
-      {
-        return "Integer.valueOf(" + value + ")";
-      }
-      else
-      {
-        return "Double.valueOf(" + value + ")";
-      }
-    }
-    else
-    {
-      throw new IllegalStateException("property-class " + className + " not supported for auto-boxing");
-    }
-  }
-
-
-  protected String convertVariableToBoxedForm(
-    String  className,
-    String  varName)
-  {
-    if ("boolean".equals(className))
-    {
-      return varName + " ? Boolean.TRUE : Boolean.FALSE";
-    }
-    else if ("char".equals(className))
-    {
-      return "Character.valueOf(" + varName + ")";
-    }
-    else if ("int".equals(className))
-    {
-      return "Integer.valueOf(" + varName + ")";
-    }
-    else if ("short".equals(className))
-    {
-      return "Short.valueOf(" + varName + ")";
-    }
-    else if ("long".equals(className))
-    {
-      return "Long.valueOf(" + varName + ")";
-    }
-    else if ("double".equals(className))
-    {
-      return "Double.valueOf(" + varName + ")";
-    }
-    else if ("float".equals(className))
-    {
-      return "Float.valueOf(" + varName + ")";
-    }
-    else
-    {
-      throw new IllegalStateException("property-class " + className + " not supported for auto-boxing");
-    }
-  }
-
-  public void writeConstructor(
-      PrettyWriter out,
-      ComponentBean component,
-      int modifiers) throws IOException
-  {
-    String fullClassName = component.getComponentClass();
-    String className = Util.getClassFromFullClass(fullClassName);
-
-    if (Modifier.isPublic(modifiers))
-    {
-      // TODO: eliminate this inconsistency
-      if (!Modifier.isAbstract(component.getComponentClassModifiers()))
-      {
-        String rendererType = component.getRendererType();
-
-        if (rendererType != null)
-          rendererType = convertStringToBoxedLiteral("String", rendererType);
-
-        out.println();
-        out.println("/**");
-        // TODO: restore this correctly phrased comment (tense vs. command)
-        //out.println(" * Constructs an instance of " + className + ".");
-        out.println(" * Construct an instance of the " + className + ".");
-        out.println(" */");
-        out.println("public " + className + "()");
-        out.println("{");
-        out.indent();
-
-        writeConstructorContent(out, component, modifiers, rendererType);
-
-        out.unindent();
-        out.println("}");
-      }
-    }
-    else if (Modifier.isProtected(modifiers))
-    {
-      out.println();
-      out.println("/**");
-      // TODO: restore this more descriptive comment with param docs
-      //out.println(" * Construct an instance of the " + className);
-      //out.println(" * with the specified renderer type.");
-      //out.println(" * ");
-      //out.println(" * @param rendererType  the renderer type");
-      out.println(" * Construct an instance of the " + className + ".");
-      out.println(" */");
-      out.println("protected " + className + "(");
-      out.indent();
-      out.println("String rendererType");
-      out.println(")");
-      out.unindent();
-      out.println("{");
-      out.indent();
-
-      writeConstructorContent(out, component, modifiers, "rendererType");
-
-      out.unindent();
-      out.println("}");
-
-      // TODO: eliminate this inconsistency
-      if (Modifier.isAbstract(component.getComponentClassModifiers()))
-      {
-        out.println();
-        out.println("/**");
-        // TODO: restore this correctly phrased comment (tense vs. command)
-        //out.println(" * Constructs an instance of " + className + ".");
-        out.println(" * Construct an instance of the " + className + ".");
-        out.println(" */");
-        out.println("protected " + className + "()");
-        out.println("{");
-        out.indent();
-        out.println("this(null);");
-        out.unindent();
-        out.println("}");
-      }
-    }
-  }
-
-  protected abstract void writeConstructorContent(
-      PrettyWriter out,
-      ComponentBean component,
-      int modifiers, String rendererType) throws IOException;
-
-  public void writeGetFamily(
-      PrettyWriter out) throws IOException
-  {
-    out.println();
-    if (_is12){
-        out.println("@Override");
-    }
-    out.println("public String getFamily()");
-    out.println("{");
-    out.indent();
-    out.println("return COMPONENT_FAMILY;");
-    out.unindent();
-    out.println("}");
-  }
-
-  public void writePropertyMethods(
-      PrettyWriter out,
-      ComponentBean component) throws IOException
-  {
-    writePropertyMethods(out, component, null);
-  }
-
-
-  public void writePropertyMethods(PrettyWriter out, ComponentBean component, Collection ignoreList)
-      throws IOException
-  {
-    Iterator properties = component.properties();
-    properties = new FilteredIterator(properties, new NonVirtualFilter());
-    while (properties.hasNext())
-    {
-      PropertyBean property = (PropertyBean) properties.next();
-      if (property.isList())
-        writePropertyListMethods(out, property, ignoreList);
-      else
-      {
-        writePropertyDeclaration(out, property);
-        writePropertyGet(out, property, ignoreList);
-        writePropertySet(out, property, ignoreList);
-        if (GeneratorHelper.isValidator(property, _is12))
-        {
-          writePropertyListMethods(out, property, ignoreList);
-        }
-      }
-    }
-  }
-
-  abstract protected void writePropertyListMethods(
-      PrettyWriter out,
-      PropertyBean property,
-      Collection inoreList) throws IOException;
-
-  abstract protected void writePropertyListMethods(
-      PrettyWriter out,
-      PropertyBean property) throws IOException;
-
-  static protected String getSingular(String plural)
-  {
-    if (plural.endsWith("s"))
-      return plural.substring(0, plural.length() - 1);
-    return plural;
-  }
-
-  protected abstract void writePropertyDeclaration(
-      PrettyWriter out,
-      PropertyBean property) throws IOException;
-
-  protected void writePropertySet(
-      PrettyWriter out,
-      PropertyBean property,
-      Collection ignoreList) throws IOException
-  {
-    String propertyClass = Util.getPropertyClass(property);
-    writePropertySet(out, property, propertyClass, ignoreList);
-
-    if (property.getAlternateClass() != null)
-    {
-      String alternateClass = Util.getAlternatePropertyClass(property);
-      writePropertySet(out, property, alternateClass, ignoreList);
-    }
-  }
-
-  protected void writePropertySet(
-      PrettyWriter out,
-      PropertyBean property,
-      String propertyClass,
-      Collection ignoreList) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String propVar = Util.getVariableFromName(propName);
-    String description = property.getDescription();
-    String setMethod = Util.getPrefixedPropertyName("set", propName);
-    if (ignoreList != null && ignoreList.contains(setMethod))
-    {
-      return;
-    }
-    out.println();
-    out.println("/**");
-    if (description != null)
-    {
-      out.println(" * Sets " + convertMultilineComment(description));
-    }
-
-    if (property.isRequired())
-    {
-      out.println(" * <p>");
-      out.println(" * This is a required property on the component.");
-    }
-    out.println(" * ");
-    out.println(" * @param " + Util.getVariableFromName(propName) + "  the new " + propName + " value");
-    if (property.isMethodBinding() && _is12)
-    {
-      out.println(" * @deprecated");
-    }
-    out.println(" */");
-
-    if (isAccessorMethodFinal())
-    {
-      out.print("final ");
-    }
-
-    out.println("public void " + setMethod + "(" + propertyClass + " " + propVar + ")");
-    out.println("{");
-    out.indent();
-    writePropertySetterMethodBody(out, property, propertyClass);
-    out.unindent();
-    out.println("}");
-  }
-
-  protected abstract void writePropertySetterMethodBody(
-      PrettyWriter out,
-      PropertyBean property,
-      String propertyClass) throws IOException;
-
-  protected void writePropertyGet(
-      PrettyWriter out,
-      PropertyBean property,
-      Collection ignoreList) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String propertyFullClass = property.getPropertyClass();
-    String propertyClass = Util.getClassFromFullClass(propertyFullClass);
-    String description = property.getDescription();
-    String getMethod = Util.getMethodReaderFromProperty(propName, propertyClass);
-    if (ignoreList != null && ignoreList.contains(getMethod))
-    {
-      return;
-    }
-    boolean isUnchecked = false;
-    String[] genericTypes = property.getPropertyClassParameters();
-    if (genericTypes != null && genericTypes.length > 0)
-    {
-      isUnchecked = true;
-      propertyClass = Util.getPropertyClass(property);
-    }
-
-    out.println();
-    out.println("/**");
-    if (description != null)
-    {
-      out.println(" * Gets " + convertMultilineComment(description));
-    }
-    if (property.isRequired())
-    {
-      out.println(" * <p>");
-      out.println(" * This is a required property on the component.");
-      out.println(" * </p>");
-    }
-
-    out.println(" *");
-    out.println(" * @return  the new " + propName + " value");
-    if (property.isMethodBinding() && _is12)
-    {
-      out.println(" * @deprecated");
-    }
-    out.println(" */");
-
-    if (isUnchecked)
-    {
-      out.println("@SuppressWarnings(\"unchecked\")");
-    }
-
-    if (isAccessorMethodFinal())
-    {
-      out.print("final ");
-    }
-
-    out.println("public " + propertyClass + " " + getMethod + "()");
-    out.println("{");
-    out.indent();
-
-    writePropertyGetterMethodBody(out, property);
-
-    out.unindent();
-    out.println("}");
-  }
-
-  /**
-   * Whether the getters/setters have the final modifier
-   *
-   * @return true if the getters/setters are final
-   */
-  protected boolean isAccessorMethodFinal()
-  {
-    return false;
-  }
-
-  protected abstract void writePropertyGetterMethodBody(
-      PrettyWriter out,
-      PropertyBean property) throws IOException;
-
-  public void writeFacetMethods(
-      PrettyWriter out,
-      ComponentBean component) throws IOException
-  {
-    Iterator facets = component.facets();
-    while (facets.hasNext())
-    {
-      FacetBean facet = (FacetBean) facets.next();
-      writeFacetGet(out, facet);
-      writeFacetSet(out, facet);
-    }
-  }
-
-  public void writeFacetSet(
-      PrettyWriter out,
-      FacetBean facet) throws IOException
-  {
-    String facetName = facet.getFacetName();
-    // TODO: drop the unnecessary "Facet" suffix
-    String facetVar = facetName + "Facet";
-    String facetKey = Util.getConstantNameFromProperty(facetName, "_FACET");
-    String setMethod = Util.getPrefixedPropertyName("set", facetName);
-    String description = facet.getDescription();
-
-    out.println();
-    out.println("/**");
-    if (description != null)
-    {
-      out.println(" * " + convertMultilineComment(description));
-    }
-    if (facet.isRequired())
-    {
-      out.println(" * <p>");
-      out.println(" * This is a required facet on the component.");
-    }
-    // TODO: put this back in
-    //out.println(" * ");
-    //out.println(" * @param " + facetVar + "  the new " + facetName + " facet");
-    out.println(" */");
-
-    // Remove type safety warning since getFacets is not generics enabled
-    // under JSF 1.1 spec
-    // TODO: Remove this line when Trinidad switch to JSF 1.2
-    out.println("@SuppressWarnings(\"unchecked\")");
-
-    out.println("final public void " + setMethod + "(UIComponent " + facetVar + ")");
-    out.println("{");
-    out.indent();
-    out.println("getFacets().put(" + facetKey + ", " + facetVar + ");");
-    out.unindent();
-    out.println("}");
-  }
-
-  public void writeFacetGet(
-      PrettyWriter out,
-      FacetBean facet) throws IOException
-  {
-    String facetName = facet.getFacetName();
-    String facetKey = Util.getConstantNameFromProperty(facetName, "_FACET");
-    String getMethod = Util.getPrefixedPropertyName("get", facetName);
-    String description = facet.getDescription();
-
-    out.println();
-    out.println("/**");
-    if (description != null)
-    {
-      out.println(" * " + convertMultilineComment(description));
-    }
-    if (facet.isRequired())
-    {
-      out.println(" * <p>");
-      out.println(" * This is a required facet on the component.");
-    }
-    // TODO: put this back in
-    //out.println(" * ");
-    //out.println(" * @return  the " + facetName + " facet");
-    out.println(" */");
-
-    out.println("final public UIComponent " + getMethod + "()");
-    out.println("{");
-    out.indent();
-    out.println("return getFacet(" + facetKey + ");");
-    out.unindent();
-    out.println("}");
-  }
-
-  public void writeListenerMethods(
-      PrettyWriter out,
-      ComponentBean component) throws IOException
-  {
-    Iterator events = component.events();
-    while (events.hasNext())
-    {
-      EventRefBean eventRef = (EventRefBean) events.next();
-      EventBean event = eventRef.resolveEventType();
-      if (event != null)
-      {
-        writeListenerAdd(out, event);
-        writeListenerRemove(out, event);
-        writeListenersGet(out, event);
-      }
-    }
-  }
-
-  public void writeListenerAdd(
-      PrettyWriter out,
-      EventBean event) throws IOException
-  {
-    String listenerFullClass = event.getEventListenerClass();
-    String listenerClass = Util.getClassFromFullClass(listenerFullClass);
-
-    String eventName = event.getEventName();
-    String addMethod = Util.getMethodNameFromEvent("add", eventName, "Listener");
-
-    out.println();
-    out.println("/**");
-    out.println(" * Adds a " + eventName + " listener.");
-    out.println(" *");
-    out.println(" * @param listener  the " + eventName + " listener to add");
-    out.println(" */");
-
-    if (isAccessorMethodFinal())
-    {
-      out.print("final ");
-    }
-    out.println("public void " + addMethod + "(");
-    out.indent();
-    out.println(listenerClass + " listener)");
-    out.unindent();
-    out.println("{");
-    out.indent();
-    out.println("addFacesListener(listener);");
-    out.unindent();
-    out.println("}");
-  }
-
-  public void writeListenerRemove(
-      PrettyWriter out,
-      EventBean event) throws IOException
-  {
-    String listenerFullClass = event.getEventListenerClass();
-    String listenerClass = Util.getClassFromFullClass(listenerFullClass);
-
-    String eventName = event.getEventName();
-    String removeMethod = Util.getMethodNameFromEvent("remove", eventName, "Listener");
-
-    out.println();
-    out.println("/**");
-    out.println(" * Removes a " + eventName + " listener.");
-    out.println(" *");
-    out.println(" * @param listener  the " + eventName + " listener to remove");
-    out.println(" */");
-
-    if (isAccessorMethodFinal())
-    {
-      out.print("final ");
-    }
-    out.println("public void " + removeMethod + "(");
-    out.indent();
-    out.println(listenerClass + " listener)");
-    out.unindent();
-    out.println("{");
-    out.indent();
-    out.println("removeFacesListener(listener);");
-    out.unindent();
-    out.println("}");
-  }
-
-  public void writeListenersGet(
-      PrettyWriter out,
-      EventBean event) throws IOException
-  {
-    String listenerFullClass = event.getEventListenerClass();
-    String listenerClass = Util.getClassFromFullClass(listenerFullClass);
-
-    String eventName = event.getEventName();
-    String getMethod = Util.getMethodNameFromEvent("get", eventName, "Listeners");
-
-    out.println();
-    out.println("/**");
-    out.println(" * Returns an array of attached " + eventName + " listeners.");
-    out.println(" *");
-    out.println(" * @return  an array of attached " + eventName + " listeners.");
-    out.println(" */");
-
-    if (isAccessorMethodFinal())
-    {
-      out.print("final ");
-    }
-    out.println("public " + listenerClass + "[] " + getMethod + "()");
-    out.println("{");
-    out.indent();
-    out.println("return (" + listenerClass + "[])" +
-        "getFacesListeners(" + listenerClass + ".class);");
-    out.unindent();
-    out.println("}");
-  }
-
-
-  public abstract void writeStateManagementMethods(PrettyWriter out,
-                                                   ComponentBean component) throws IOException;
-
-  public void writeOther(
-      PrettyWriter out, ComponentBean component) throws IOException
-  {
-    // nothing
-  }
-
-  protected String convertMultilineComment(
-      String commentBody)
-  {
-    return commentBody.replaceAll("\n", "\n * ");
-  }
-
-  protected class ResolvableTypeFilter extends PropertyFilter
-  {
-    protected boolean accept(
-        PropertyBean property)
-    {
-      String propertyClass = property.getPropertyClass();
-      String resolvableType = resolveType(propertyClass);
-      return (resolvableType != null);
-    }
-  }
-
-  protected class NonVirtualFilter extends PropertyFilter
-  {
-    protected boolean accept(
-        PropertyBean property)
-    {
-      return (!property.isVirtual());
-    }
-  }
-
-  static protected String resolveType(
-      String className)
-  {
-    return (String) _RESOLVABLE_TYPES.get(className);
-  }
-
-
-  static private Map _createResolvableTypes()
-  {
-    Map resolvableTypes = new HashMap();
-
-    resolvableTypes.put("boolean", "Boolean");
-    resolvableTypes.put("char", "Character");
-    // TODO: put this back in
-    //resolvableTypes.put("java.util.Date", "Date");
-    resolvableTypes.put("int", "Integer");
-    resolvableTypes.put("float", "Float");
-    resolvableTypes.put("double", "Double");
-    resolvableTypes.put("java.util.Locale", "Locale");
-    resolvableTypes.put("long", "Long");
-    resolvableTypes.put("java.lang.String", "String");
-    resolvableTypes.put("java.lang.Number", "Number");
-    // TODO: put this back in
-    //resolvableTypes.put("java.lang.String[]", "StringArray");
-    resolvableTypes.put("java.util.TimeZone", "TimeZone");
-
-    return Collections.unmodifiableMap(resolvableTypes);
-  }
-
-  static private final Pattern _GENERIC_TYPE = Pattern.compile("([^<]+)<(.+)>");
-  static final private Map _RESOLVABLE_TYPES = _createResolvableTypes();
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/component/ComponentGenerator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/component/ComponentGenerator.java
deleted file mode 100644
index aeca798..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/component/ComponentGenerator.java
+++ /dev/null
@@ -1,81 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.component;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.ClassGenerator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ComponentBean;
-
-import java.io.IOException;
-import java.util.Collection;
-
-/**
- * Generates component classes
- *
- * @author Bruno Aranda (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-public interface ComponentGenerator extends ClassGenerator
-{
-
-  void writeGenericConstants(
-      PrettyWriter out,
-      String componentFamily,
-      String componentType) throws IOException;
-
-  void writePropertyConstants(
-      PrettyWriter out,
-      String superclassName,
-      ComponentBean component) throws IOException;
-
-  void writePropertyValueConstants(
-      PrettyWriter out,
-      ComponentBean component) throws IOException;
-
-  void writeFacetConstants(
-      PrettyWriter out,
-      ComponentBean component) throws IOException;
-
-  void writeGetFamily(
-      PrettyWriter out) throws IOException;
-
-  void writePropertyMethods(
-      PrettyWriter out,
-      ComponentBean component) throws IOException;
-
-  void writeFacetMethods(
-      PrettyWriter out,
-      ComponentBean component) throws IOException;
-
-  void writeListenerMethods(
-      PrettyWriter out,
-      ComponentBean component) throws IOException;
-
-  void writeStateManagementMethods(
-      PrettyWriter out,
-      ComponentBean component) throws IOException;
-
-  void writeOther(
-      PrettyWriter out, ComponentBean component) throws IOException;
-
-
-  void writePropertyMethods(PrettyWriter out,
-                            ComponentBean component,
-                            Collection ignoreList) throws IOException;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/component/MyFacesComponentGenerator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/component/MyFacesComponentGenerator.java
deleted file mode 100644
index c5b506c..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/component/MyFacesComponentGenerator.java
+++ /dev/null
@@ -1,562 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.component;
-
-import org.apache.maven.plugin.logging.Log;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.GeneratorHelper;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ComponentBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * Component generator for MyFaces
- *
- * @author Bruno Aranda (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-public class MyFacesComponentGenerator extends AbstractComponentGenerator
-{
-
-  public MyFacesComponentGenerator(Log log, boolean is12)
-  {
-    super(log, is12);
-  }
-
-
-  protected void addSpecificImports(Set imports, ComponentBean component)
-  {
-    imports.add("javax.faces.context.FacesContext");
-    if (_is12){
-        imports.add("javax.el.ValueExpression");
-    }else{
-        imports.add("javax.faces.el.ValueBinding");
-    }
-    for (Iterator lIterator = component.properties(); lIterator.hasNext();)
-    {
-      PropertyBean lPropertyBean = (PropertyBean) lIterator.next();
-      if (GeneratorHelper.isValidator(lPropertyBean, _is12))
-      {
-        imports.add("javax.faces.validator.Validator");
-        imports.add("java.util.ArrayList");
-        imports.add("java.util.List");
-        break;
-      }
-    }
-  }
-
-  public void writePropertyDeclaration(PrettyWriter out,
-                                       PropertyBean property) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String fieldPropName = property.getFieldPropertyName();
-    String propertyFullClass = property.getPropertyClass();
-    String propertyClass = Util.getClassFromFullClass(propertyFullClass);
-    String propertyGenerics = Util.getGenericsFromProperty(property);
-    String def = Util.getDefaultValue(property);
-    
-    if (propertyClass.endsWith("Boolean")){
-        def = "Boolean.valueOf("+def+")";
-    }
-
-    out.println();
-    out.println("// Property: " + propName);
-    if (property.isLiteralOnly() || property.isTagAttributeExcluded()){
-        //If the property is literal or is tagAttributeExcluded, 
-        //the default value goes on the definition of the field
-        out.println("private " + propertyClass + propertyGenerics + " " +
-                fieldPropName + (def == null ? ";" : " = " + def + ";"));        
-    }else{        
-        //If is a primitive class, has a set field to check if this
-        //property is defined, so the default value goes on the 
-        //getter method.
-        //If is a class, the same applies, because the check
-        //is against null
-        out.println("private " + propertyClass + propertyGenerics + " " +
-                fieldPropName + ";");        
-    }
-
-    if (Util.isPrimitiveClass(propertyFullClass) && !property.isTagAttributeExcluded())
-    {
-      out.println("private boolean " + fieldPropName + "Set;");
-      
-      if (property.isIsSetMethod()){
-          out.println();
-          String scope = property.getIsSetMethodScope();
-          if (scope == null) scope = "protected";
-          out.println(scope+" boolean "+Util.getPrefixedPropertyName("isSet", propName) + "()");
-          out.println("{");
-          out.indent();
-          out.println("return " + fieldPropName + "Set;");
-          out.unindent();
-          out.println("}");
-      }
-    }
-    
-    if (property.isIsGetLocalMethod()){
-        String methodPrefix = ("boolean".equals(propertyClass) ? "isLocal" : "getLocal");
-        String methodName = Util.getPrefixedPropertyName(methodPrefix, propName);
-        
-        out.println();
-        String scope = property.getIsGetLocalMethodScope();
-        if (scope == null) scope = "protected";
-        
-        out.println("final "+scope+" " + propertyClass + " " + methodName + "()");
-        out.println("{");
-        out.indent();
-        out.println("return " + fieldPropName + ";");
-        out.unindent();
-        out.println("}");
-                
-    }    
-  }
-
-  public void writeStateManagementMethods(PrettyWriter out,
-                                          ComponentBean component) throws IOException
-  {
-    if (!component.hasProperties())
-    {
-      return;
-    }
-
-    writeSaveState(out, component);
-    writeRestoreState(out, component);
-  }
-
-  public void writePropertyListMethods(
-      PrettyWriter out,
-      PropertyBean property) throws IOException
-  {
-    // nothing
-  }
-
-  protected void writeConstructorContent(PrettyWriter out, ComponentBean component, int modifiers, String rendererType) throws IOException
-  {
-    out.println("setRendererType(" + rendererType + ");");
-  }
-
-  protected void writePropertyListMethods(PrettyWriter out, PropertyBean property, Collection ignoreList)
-  {
-    String propName = property.getPropertyName();
-    String generic;
-    String type;
-    boolean isValidator = GeneratorHelper.isValidator(property, _is12);
-    if (isValidator)
-    {
-      generic = "<Validator>";
-      type = "Validator";
-    }
-    else if (property.getAttributeClassParameters().length == 1)
-    {
-      generic = Util.getGenericsFromProperty(property);
-      type = Util.getClassFromFullClass(property.getAttributeClassParameters()[0]);
-    }
-    else
-    {
-      throw new IllegalArgumentException("only one Generic Parameter is allowed for Lists");
-    }
-
-    String singularName = getSingular(propName);
-    String propVar = Util.getVariableFromName(singularName);
-    String description = property.getDescription();
-    String addMethod = Util.getPrefixedPropertyName("add", singularName);
-    String removeMethod = Util.getPrefixedPropertyName("remove", singularName);
-    String getMethod = Util.getPrefixedPropertyName("get", singularName + "s");
-    String fieldPropName = property.getFieldPropertyName() + (isValidator ? "List" : "");
-
-    out.println();
-    out.println("// Property: " + propName);
-    out.println("private List" + generic + " " + fieldPropName + ";");
-    if (ignoreList == null || !ignoreList.contains(addMethod))
-    {
-      out.println();
-      out.println("/**");
-      if (description != null)
-      {
-        out.println(" * Adds a " + convertMultilineComment(description));
-      }
-      out.println(" */");
-      out.println("public void " + addMethod + "( " + type + " " +
-          propVar + ")");
-      out.println("{");
-      out.indent();
-      out.println("if (" + propVar + " == null) throw new NullPointerException(\"" + propVar + "\");");
-      out.println("if (" + fieldPropName + " == null)");
-      out.println("  " + fieldPropName + " = new ArrayList" + generic + "();");
-      out.println();
-      out.println(fieldPropName + ".add(" + propVar + ");");
-      out.unindent();
-      out.println("}");
-    }
-
-    if (ignoreList == null || !ignoreList.contains(removeMethod))
-    {
-      out.println();
-      out.println("/**");
-      if (description != null)
-      {
-        out.println(" * Removes a " + convertMultilineComment(description));
-      }
-      out.println(" */");
-      out.println("public void " + removeMethod + "( " + type + " " + propVar + ")");
-      out.println("{");
-      out.indent();
-      out.println("if (" + propVar + " == null || " + fieldPropName + " == null)");
-      out.println("  return;");
-      out.println();
-      out.println(fieldPropName + ".remove(" + propVar + ");");
-      out.unindent();
-      out.println("}");
-    }
-
-    if (ignoreList == null || !ignoreList.contains(getMethod))
-    {
-      if (isValidator)
-      {
-        out.println("private static final " + type + "[] EMPTY_" + type.toUpperCase() + "_ARRAY = new " + type + "[0];");
-      }
-      out.println();
-      out.println("/**");
-      if (description != null)
-      {
-        out.println(" * Gets all " + convertMultilineComment(description));
-      }
-      out.println(" */");
-      if (isValidator)
-      {
-        out.println("public " + type + "[] " + getMethod + "()");
-      }
-      else
-      {
-        out.println("public List" + generic + " " + getMethod + "()");
-      }
-      out.println("{");
-      out.indent();
-      if (isValidator)
-      {
-        out.println("return " + fieldPropName + "== null? EMPTY_" + type.toUpperCase() + "_ARRAY : " + fieldPropName + ".toArray(new " + type + "[" + fieldPropName + ".size()]);");
-      }
-      else
-      {
-        out.println("if (" + fieldPropName + " == null)");
-        out.indent();
-        out.println(fieldPropName + " = new ArrayList<" + type + ">();");
-        out.unindent();
-        out.println("return " + fieldPropName + ";");
-      }
-      out.unindent();
-      out.println("}");
-    }
-  }
-
-  protected void writePropertySetterMethodBody(PrettyWriter out,
-                                               PropertyBean property,
-                                               String propertyClass) throws IOException
-  {
-    String varName = property.getFieldPropertyName();
-    String propVar = Util.getVariableFromName(property.getPropertyName());
-
-    out.println("this." + varName + " = " + propVar + ";");
-
-    if (Util.isPrimitiveClass(propertyClass) && !property.isTagAttributeExcluded())
-    {
-      out.println("this." + _primitiveSetVarName(varName) + " = true;");
-    }
-  }
-
-  protected void writePropertyGetterMethodBody(PrettyWriter out,
-                                               PropertyBean property) throws IOException
-  {
-    String varName = property.getFieldPropertyName();
-    String propFullClass = property.getPropertyClass();
-    String propClass = Util.getClassFromFullClass(propFullClass);
-    if (property.isTagAttributeExcluded())
-    {
-      out.println("return " + property.getFieldPropertyName() + ";");
-    }
-    else if(property.isLiteralOnly())
-    {
-      out.println("return " + varName + ";");
-    }
-    else
-    {
-      if (Util.isPrimitiveClass(propFullClass))
-      {
-        out.println("if (" + _primitiveSetVarName(varName) + ")");
-      }
-      else
-      {
-        out.println("if (" + varName + " != null)");
-      }
-      out.println("{");
-      out.indent();
-      out.println("return " + property.getFieldPropertyName() + ";");
-      out.unindent();
-      out.println("}");
-      if (_is12){
-          out.println("ValueExpression expression = getValueExpression(\"" + property.getPropertyName() + "\");");
-          out.println("if (expression != null)");
-          out.println("{");
-          out.indent();
-          out.println("return " + _castIfNecessary(propClass) + "expression.getValue(getFacesContext().getELContext());");
-          out.unindent();
-          out.println("}");
-      }
-      else
-      {
-          out.println("ValueBinding vb = getValueBinding(\"" + property.getPropertyName() + "\");");
-          out.println("if (vb != null)");
-          out.println("{");
-          out.indent();
-          
-          if (Util.isPrimitiveClass(propFullClass))
-          {                 
-              out.println("return (" + _castIfNecessary(propClass) + "vb.getValue(getFacesContext()))."+propClass+"Value();");
-          }
-          else
-          {
-              String type = null; 
-              if ( (type = Util.getPrimitiveType(propClass)) != null)
-              {
-                  out.println("Object value = vb == null ? null : vb.getValue(getFacesContext());");
-                  out.println("if (!(value instanceof "+propClass+")){");
-                  out.indent();
-                  out.println("value = " + Util.getBoxedClass(type) +".valueOf(value.toString());");
-                  out.unindent();
-                  out.println("}");
-                  out.println("return " + _castIfNecessary(propClass) + "value;");                  
-              }
-              else
-              {
-                  out.println("return " + _castIfNecessary(propClass) + "vb.getValue(getFacesContext());");                  
-              }
-          }
-          out.unindent();
-          out.println("}");          
-      }
-
-      String ret = Util.getDefaultValue(property);
-      if (null != ret)
-      {
-        out.println("return " + ret + ";");
-      }
-      else if (Util.isPrimitiveClass(propFullClass))
-      {
-        out.println("return " + Util.primitiveDefaultValue(propFullClass) + ";");
-      }
-      else
-      {
-        out.println("return null;");
-      }
-    }
-  }
-
-  protected void writeSaveState(PrettyWriter out,
-                                ComponentBean component) throws IOException
-  {
-    String arrayName = "values";
-
-    // first we count the primitive properties, because for each primitive property
-    // we save a new property that says if the property has been set or not
-    int primitivePropertiesCount = 0;
-    for (Iterator iterator = component.properties(); iterator.hasNext();)
-    {
-      PropertyBean property = (PropertyBean) iterator.next();
-      if (Util.isPrimitiveClass(property.getPropertyClass()))
-      {
-        primitivePropertiesCount++;
-      }
-    }
-
-    // the total array size is the number of properties, plus the number of primitives,
-    // plus 1 (the super call)
-    int arraySize = component.propertiesSize() + primitivePropertiesCount + 1;
-
-    out.println();
-    if (_is12){
-        out.println("@Override");
-    }
-    out.println("public Object saveState(FacesContext facesContext)");
-    out.println("{");
-    out.indent();
-    out.println("Object[] " + arrayName + " = new Object[" + arraySize + "];");
-
-    out.println(arrayName + "[" + 0 + "] = super.saveState(facesContext);");
-
-    int propIndex = 1;
-
-    for (Iterator iterator = component.properties(); iterator.hasNext();)
-    {
-      PropertyBean property = (PropertyBean) iterator.next();
-      String varName = property.getFieldPropertyName();
-
-      if (property.isStateHolder())
-      {
-        if (GeneratorHelper.isValidator(property, _is12))
-        {
-          out.println(arrayName + "[" + ++propIndex + "] = saveAttachedState(facesContext, " + varName + "List);");
-        }
-        else if (property.isList())
-        {
-          out.println(arrayName + "[" + ++propIndex + "] = saveAttachedState(facesContext, " + varName + ");");
-        }
-        else
-        {
-          out.println(arrayName + "[" + propIndex + "] = saveAttachedState(facesContext, " + varName + ");");
-        }
-      }
-      else if (GeneratorHelper.isConverter(property.getPropertyClass()))
-      {
-        out.println(arrayName + "[" + propIndex + "] = saveAttachedState(facesContext, " + varName + ");");
-      }
-      else
-      {
-        if (!_is12 && Util.isPrimitiveClass(property.getPropertyClass())){
-            out.println(arrayName + "[" + propIndex + "] = "+Util.getBoxedClass(property.getPropertyClass())+".valueOf(" + varName + ");");
-        }
-        else
-        {
-            out.println(arrayName + "[" + propIndex + "] = " + varName + ";");
-        }        
-      }
-
-      propIndex++;
-
-      if (Util.isPrimitiveClass(property.getPropertyClass()) && !property.isTagAttributeExcluded())
-      {
-        if (!_is12){
-            out.println(arrayName + "[" + propIndex + "] = Boolean.valueOf(" + _primitiveSetVarName(varName) + ");");
-        }else{
-            out.println(arrayName + "[" + propIndex + "] = " + _primitiveSetVarName(varName) + ";");
-        }
-        propIndex++;
-      }
-    }
-
-    out.println();
-    out.println("return " + arrayName + ";");
-    out.unindent();
-    out.println("}");
-  }
-
-  protected void writeRestoreState(PrettyWriter out,
-                                   ComponentBean component) throws IOException
-  {
-    String arrayName = "values";
-
-    out.println();
-    if (_is12){
-        out.println("@Override");
-    }
-    out.println("public void restoreState(FacesContext facesContext, Object state)");
-    out.println("{");
-    out.indent();
-
-    out.println("Object[] " + arrayName + " = (Object[])state;");
-    out.println("super.restoreState(facesContext," + arrayName + "[0]);");
-
-    int propIndex = 1;
-
-    for (Iterator iterator = component.properties(); iterator.hasNext();)
-    {
-      PropertyBean property = (PropertyBean) iterator.next();
-
-      String varName = property.getFieldPropertyName();
-      String propFullClass = property.getPropertyClass();
-      String propClass = Util.getClassFromFullClass(propFullClass);
-
-      if (property.isStateHolder())
-      {
-        if (GeneratorHelper.isValidator(property, _is12))
-        {
-          out.println(varName + "List = (List<Validator>) restoreAttachedState(facesContext, "
-              + arrayName + "[" + ++propIndex + "]);");
-        }
-        else if (property.isList())
-        {
-          out.println(varName + " = (List) restoreAttachedState(facesContext, "
-              + arrayName + "[" + ++propIndex + "]);");
-        }
-        else
-        {
-          out.println(varName + " = " + _castIfNecessary(propClass) + "restoreAttachedState(facesContext, "
-              + arrayName + "[" + propIndex + "]);");
-        }
-
-      }
-      else if (GeneratorHelper.isConverter(property.getPropertyClass()))
-      {
-        out.println(varName + " = (Converter) restoreAttachedState(facesContext, "
-            + arrayName + "[" + propIndex + "]);");
-      }
-      else
-      {
-        if (!_is12 && Util.isPrimitiveClass(property.getPropertyClass())){
-            out.println(varName + " = (" + _castIfNecessary(propClass)
-                    + arrayName + "[" + propIndex + "])."+propClass+"Value();");            
-        }else{
-            out.println(varName + " = " + _castIfNecessary(propClass)
-                    + arrayName + "[" + propIndex + "];");
-        }
-      }
-
-      propIndex++;
-
-      if (Util.isPrimitiveClass(property.getPropertyClass()) && !property.isTagAttributeExcluded())
-      {
-        if (!_is12){
-            out.println(_primitiveSetVarName(varName) + " = ((Boolean)"
-                    + arrayName + "[" + propIndex + "]).booleanValue();");
-        }else{
-            out.println(_primitiveSetVarName(varName) + " = (Boolean)"
-                    + arrayName + "[" + propIndex + "];");
-        }
-        propIndex++;
-      }
-    }
-
-    out.unindent();
-    out.println("}");
-  }
-
-  private static String _castIfNecessary(String propClass)
-  {
-    if (propClass.equals("Object") || propClass.equals("java.lang.Object"))
-    {
-      return "";
-    }
-
-    if (Util.isPrimitiveClass(propClass))
-    {
-      propClass = Util.getBoxedClass(propClass);
-    }
-
-    return "(" + propClass + ")";
-  }
-
-  private static String _primitiveSetVarName(String varName)
-  {
-    return varName + "Set";
-  }
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/component/TrinidadComponentGenerator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/component/TrinidadComponentGenerator.java
deleted file mode 100644
index ce5d27c..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/component/TrinidadComponentGenerator.java
+++ /dev/null
@@ -1,399 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.component;
-
-import org.apache.maven.plugin.logging.Log;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ComponentBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.FilteredIterator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.PropertyFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-
-import java.io.IOException;
-import java.lang.reflect.Modifier;
-import java.util.*;
-
-public class TrinidadComponentGenerator extends AbstractComponentGenerator
-{
-  public TrinidadComponentGenerator(Log log, boolean is12)
-  {
-    super(log, is12);
-  }
-
-  protected void addSpecificImports(Set imports, ComponentBean component)
-  {
-    // FacesBean is always needed to define the TYPE
-
-    imports.add("org.apache.myfaces.trinidad.bean.FacesBean");
-
-    Iterator properties = component.properties();
-    properties = new FilteredIterator(properties, new NonVirtualFilter());
-    // PropertyKey only needed if there are properties
-    if (properties.hasNext())
-    {
-      imports.add("org.apache.myfaces.trinidad.bean.PropertyKey");
-
-      PropertyFilter resolvable = new ResolvableTypeFilter();
-      while (properties.hasNext())
-      {
-        PropertyBean property = (PropertyBean) properties.next();
-
-        // ComponentUtils only needed for resolvable properties
-        if (resolvable.accept(property))
-          imports.add("org.apache.myfaces.trinidad.util.ComponentUtils");
-      }
-    }
-  }
-
-  protected void writeConstructorContent(PrettyWriter out,
-                                         ComponentBean component,
-                                         int modifiers,
-                                         String rendererType) throws IOException
-  {
-    out.println("super(" + rendererType + ");");
-  }
-
-  protected void writePropertyListMethods(PrettyWriter out, PropertyBean property, Collection gnoreList)
-  {
-    // nothing
-  }
-
-  public void writePropertyConstants(
-      PrettyWriter out,
-      String superclassName,
-      ComponentBean component) throws IOException
-  {
-    out.println("static public final FacesBean.Type TYPE = new FacesBean.Type(");
-    out.indent();
-    out.println(superclassName + ".TYPE);");
-    out.unindent();
-
-    //  component property keys
-    Iterator properties = component.properties();
-    properties = new FilteredIterator(properties, new NonVirtualFilter());
-    while (properties.hasNext())
-    {
-      PropertyBean property = (PropertyBean) properties.next();
-      String propName = property.getPropertyName();
-      String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-      String propAlias = property.getAliasOf();
-
-      out.println("static public final PropertyKey " + propKey + " =");
-      out.indent();
-      if (propAlias != null)
-      {
-        String aliasKey = Util.getConstantNameFromProperty(propAlias, "_KEY");
-        out.print("TYPE.registerAlias(" + aliasKey + ", \"" + propName + "\");");
-      }
-      else
-      {
-        out.print("TYPE.registerKey(\"" + propName + "\"");
-
-        // property class
-        String propFullClass = property.getPropertyClass();
-        String propClass = Util.getClassFromFullClass(propFullClass);
-        if (propClass == null)
-        {
-          propClass = "String";
-        }
-        String propDefault = property.getDefaultValue();
-
-        if (!"Object".equals(propClass) || propDefault != null)
-        {
-          // TODO: do not use boxed class here
-          String boxedClass = Util.getBoxedClass(propClass);
-          out.print(", " + boxedClass + ".class");
-        }
-
-        if (propDefault != null)
-        {
-          if (property.isEnum())
-            out.print(", Enum.valueOf(" + propClass + ".class," +
-                      convertStringToBoxedLiteral("String", propDefault) +
-                      ")");
-          else
-            out.print(", " + convertStringToBoxedLiteral(propClass, propDefault));
-        }
-
-        // property capabilities
-        String propCaps = _getPropertyCapabilities(property);
-        if (propCaps != null)
-          out.print(", " + propCaps);
-        out.println(");");
-      }
-      out.unindent();
-    }
-  }
-
-  protected void writePropertyDeclaration(PrettyWriter out, PropertyBean property) throws IOException
-  {
-    // nothing by default
-  }
-
-
-  /**
-   * Whether the getters/setters have the final modifier
-   *
-   * @return true if the getters/setters are final
-   */
-  protected boolean isAccessorMethodFinal()
-  {
-    return true;
-  }
-
-  protected void writePropertySetterMethodBody(PrettyWriter out,
-                                               PropertyBean property,
-                                               String propertyClass) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-    String propVar = Util.getVariableFromName(propName);
-
-    if (Util.isPrimitiveClass(propertyClass))
-    {
-      out.println("setProperty(" + propKey + ", " +
-                  convertVariableToBoxedForm(propertyClass, propVar) +
-                  ");");
-    }
-    else
-    {
-      out.println("setProperty(" + propKey + ", (" + propVar + "));");
-    }
-  }
-
-  protected void writePropertyGetterMethodBody(
-      PrettyWriter out,
-      PropertyBean property) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String propertyFullClass = property.getPropertyClass();
-    String propertyClass = Util.getClassFromFullClass(propertyFullClass);
-    String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-
-    String resolvableType = resolveType(propertyFullClass);
-
-    if (resolvableType != null)
-    {
-      // TODO: change signature of ComponentUtils.resolveCharacter
-      //       to take Object instead of Character
-      if (resolvableType.equals("Character"))
-      {
-        out.println("return ComponentUtils.resolveCharacter((Character)getProperty(" + propKey + "));");
-      }
-      else
-      {
-        // TODO: stop specifying default values in the getters
-        String resolveMethod = Util.getPrefixedPropertyName("resolve", resolvableType);
-        String propertyDefault = property.getDefaultValue();
-        out.print("return ComponentUtils." + resolveMethod + "(getProperty(" + propKey + ")");
-        if (propertyDefault != null)
-        {
-          out.print(", " + Util.convertStringToLiteral(propertyClass,
-              propertyDefault));
-        }
-        out.println(");");
-      }
-    }
-    else
-    {
-      if (propertyClass.equals("Object"))
-      {
-        // Cast is not necessary if the property class is Object
-        out.println("return getProperty(" + propKey + ");");
-      }
-      else
-      {
-        out.println("return (" + propertyClass + ")" +
-            "getProperty(" + propKey + ");");
-      }
-    }
-  }
-
-  public void writeStateManagementMethods(PrettyWriter out, ComponentBean component) throws IOException
-  {
-    // nothing to do here
-  }
-
-  public void writePropertyListMethods(
-      PrettyWriter out,
-      PropertyBean property) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-    String propertyClass = property.getPropertyClass();
-    if (!"java.util.List".equals(propertyClass))
-    {
-      getLog().error("Invalid list type: " + propertyClass);
-      return;
-    }
-
-    // Look for the generic type - if it doesn't exist, then
-    // we'll be an Object.
-    String[] params = property.getPropertyClassParameters();
-    if ((params == null) || (params.length == 0))
-      propertyClass = "java.lang.Object";
-    else
-      propertyClass = params[0];
-
-    propertyClass = Util.getClassFromFullClass(propertyClass);
-
-    String singularName = getSingular(propName);
-    String propVar = Util.getVariableFromName(singularName);
-    String description = property.getDescription();
-    String addMethod = Util.getPrefixedPropertyName("add", singularName);
-    String removeMethod = Util.getPrefixedPropertyName("remove", singularName);
-    String getMethod = Util.getPrefixedPropertyName("get", propName);
-
-    out.println();
-    out.println("/**");
-    if (description != null)
-    {
-      out.println(" * Adds a " + convertMultilineComment(description));
-    }
-    out.println(" */");
-    out.println("final public void " + addMethod + "(" + propertyClass + " " +
-        propVar + ")");
-    out.println("{");
-    out.indent();
-    out.println("if (" + propVar + " == null)");
-    out.println("  throw new NullPointerException();");
-    out.println();
-    out.println("getFacesBean().addEntry(" + propKey + ", " + propVar + ");");
-    out.unindent();
-    out.println("}");
-
-    out.println();
-    out.println("/**");
-    if (description != null)
-    {
-      out.println(" * Removes a " + convertMultilineComment(description));
-    }
-    out.println(" */");
-    out.println("final public void " + removeMethod + "(" + propertyClass + " " +
-        propVar + ")");
-    out.println("{");
-    out.indent();
-    out.println("if (" + propVar + " == null)");
-    out.println("  throw new NullPointerException();");
-    out.println();
-    out.println("getFacesBean().removeEntry(" + propKey + ", " + propVar + ");");
-    out.unindent();
-    out.println("}");
-
-    out.println();
-    out.println("/**");
-    if (description != null)
-    {
-      out.println(" * Gets all " + convertMultilineComment(description));
-    }
-    out.println(" */");
-    out.println("final public " + propertyClass + "[] " + getMethod + "()");
-    out.println("{");
-    out.indent();
-    out.println("return (" + propertyClass + "[]) getFacesBean().getEntries(");
-    out.println("         " + propKey + ", " + propertyClass + ".class);");
-    out.unindent();
-    out.println("}");
-  }
-
-  public void writeOther(PrettyWriter out, ComponentBean component) throws IOException
-  {
-    _writeGetBeanType(out);
-
-    writeConstructor(out, component, Modifier.PROTECTED);
-
-    _writeTypeLock(out, component);
-  }
-
-  protected void _writeGetBeanType(
-      PrettyWriter out) throws IOException
-  {
-    out.println();
-    out.println("@Override");
-    out.println("protected FacesBean.Type getBeanType()");
-    out.println("{");
-    out.indent();
-    out.println("return TYPE;");
-    out.unindent();
-    out.println("}");
-  }
-
-  private void _writeTypeLock(
-      PrettyWriter out, ComponentBean component) throws IOException
-  {
-    out.println();
-    out.println("static");
-    out.println("{");
-    out.indent();
-    String rendererType = component.getRendererType();
-    if (rendererType == null)
-    {
-      out.println("TYPE.lock();");
-    }
-    else
-    {
-      String componentFamily = component.findComponentFamily();
-      out.println("TYPE.lockAndRegister(\"" + componentFamily + "\"," +
-          "\"" + rendererType + "\");");
-    }
-
-    out.unindent();
-    out.println("}");
-  }
-
-  private String _getPropertyCapabilities(
-      PropertyBean property)
-  {
-    List caps = new ArrayList();
-
-    if (property.isMethodBinding() ||
-        property.isLiteralOnly())
-    {
-      caps.add("PropertyKey.CAP_NOT_BOUND");
-    }
-
-    if (property.isStateHolder())
-    {
-      caps.add("PropertyKey.CAP_STATE_HOLDER");
-    }
-
-    if (property.isTransient())
-    {
-      caps.add("PropertyKey.CAP_TRANSIENT");
-    }
-
-    if (property.isList())
-    {
-      caps.add("PropertyKey.CAP_LIST");
-    }
-
-    if (caps.isEmpty())
-      return null;
-
-    StringBuffer sb = new StringBuffer();
-    for (int i = 0; i < caps.size(); i++)
-    {
-      if (i > 0)
-        sb.append(" | ");
-      sb.append(caps.get(i));
-    }
-    return sb.toString();
-  }
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/AbstractComponentTagGenerator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/AbstractComponentTagGenerator.java
deleted file mode 100644
index 2a8db83..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/AbstractComponentTagGenerator.java
+++ /dev/null
@@ -1,297 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.GeneratorHelper;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ComponentBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.FilteredIterator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.SourceTemplate;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-
-import java.io.IOException;
-import java.lang.reflect.Modifier;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * TODO: comment this!
- *
- * @author Bruno Aranda (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-public abstract class AbstractComponentTagGenerator implements ComponentTagGenerator
-{
-
-  public void writeImports(PrettyWriter out,
-                           SourceTemplate template,
-                           String packageName,
-                           String fullSuperclassName,
-                           String superclassName,
-                           ComponentBean component)
-  {
-    Collection components = new HashSet();
-    components.add(component);
-    writeImports(out, template, packageName, fullSuperclassName, superclassName, components);
-  }
-
-
-  public void writeImports(PrettyWriter out, SourceTemplate template, String packageName, String fullSuperclassName,
-                           String superclassName, Collection components)
-  {
-    Set imports = new TreeSet();
-
-    for (Iterator lIterator = components.iterator(); lIterator.hasNext();)
-    {
-      ComponentBean component = (ComponentBean) lIterator.next();
-      Iterator properties = component.properties();
-      properties = new FilteredIterator(properties, new TagAttributeFilter());
-
-      // TODO: remove these imports
-      // FIXME: Actually last 2 can be kept when not abstract
-      //imports.add("javax.faces.component.UIComponent");
-
-      // superclassName is fully qualified if it collides
-      // with the generated class name and should not be
-      // imported when such a collision would occur
-      if (!superclassName.equals(fullSuperclassName))
-      {
-        imports.add(fullSuperclassName);
-      }
-
-      while (properties.hasNext())
-      {
-        PropertyBean property = (PropertyBean) properties.next();
-
-        String propertyClass = property.getPropertyClass();
-        String[] propertyClassParams = property.getPropertyClassParameters();
-
-        if (propertyClass != null && property.isLiteralOnly())
-        {
-          // Import the property class only if only litterals are supported
-          // otherwise the class will be a String inside the tag to support
-          // ValueBinding
-          imports.add(propertyClass);
-        }
-
-        // TODO: restore import and make reference to
-        //       ConstantMethodBinding relative rather
-        //       than absolute
-        //if (property.isMethodBinding() &&
-        //    isStringMethodBindingReturnType(property))
-        //{
-        //  imports.add("org.apache.myfaces.trinidadinternal.taglib.ConstantMethodBinding");
-        //}
-      }
-
-      addSpecificImports(imports, component);
-
-    }
-    // do not import implicit!
-    imports.removeAll(Util.PRIMITIVE_TYPES);
-
-    GeneratorHelper.writeImports(out, packageName, imports);
-  }
-
-  public void writeClassBegin(PrettyWriter out,
-                              String className,
-                              String superclassName,
-                              ComponentBean component,
-                              SourceTemplate template)
-  {
-    int modifiers = component.getTagClassModifiers();
-    String classStart = Modifier.toString(modifiers);
-
-    out.println("/**");
-    out.println(" * Auto-generated tag class.");
-    out.println(" */");
-
-    // TODO: use canonical ordering
-    classStart = classStart.replaceAll("public abstract", "abstract public");
-    out.println(classStart + " class " + className +
-        " extends " + superclassName);
-    out.println("{");
-    out.indent();
-  }
-
-
-  public void writeConstructor(PrettyWriter out,
-                               ComponentBean component,
-                               int modifiers) throws IOException
-  {
-    String fullClassName = component.getTagClass();
-    String className = Util.getClassFromFullClass(fullClassName);
-    out.println();
-    out.println("/**");
-    // TODO: restore this correctly phrased comment (tense vs. command)
-    //out.println(" * Constructs an instance of " + className + ".");
-    out.println(" * Construct an instance of the " + className + ".");
-    out.println(" */");
-    out.println("public " + className + "()");
-    out.println("{");
-    out.println("}");
-  }
-
-  public void writeGetComponentType(
-      PrettyWriter out,
-      ComponentBean component) throws IOException
-  {
-    String componentType = component.getComponentType();
-    out.println();
-
-    // The superclass does not necessarily need to have this method
-    //out.println("@Override");
-    out.println("public String getComponentType()");
-    out.println("{");
-    out.indent();
-    out.println("return \"" + componentType + "\";");
-    out.unindent();
-    out.println("}");
-  }
-
-  public void writeGetRendererType(
-      PrettyWriter out,
-      ComponentBean component) throws IOException
-  {
-    String rendererType = component.getRendererType();
-    out.println();
-
-    // The superclass does not necessarily need to have this method
-    //out.println("@Override");
-    out.println("public String getRendererType()");
-    out.println("{");
-    out.indent();
-    out.println("return " + Util.convertStringToLiteral(rendererType) + ";");
-    out.unindent();
-    out.println("}");
-  }
-
-  public void writeClassEnd(PrettyWriter out)
-  {
-    out.unindent();
-    out.println("}");
-  }
-
-  public void writePropertyMembers(PrettyWriter out,
-                                   ComponentBean component) throws IOException
-  {
-    Iterator properties = component.properties();
-    properties = new FilteredIterator(properties, new TagAttributeFilter());
-
-    while (properties.hasNext())
-    {
-      PropertyBean property = (PropertyBean) properties.next();
-      writePropertyDeclaration(out, property);
-      writePropertySetter(out, property);
-    }
-  }
-
-
-  public void writePropertyMembers(PrettyWriter out, Collection components) throws IOException
-  {
-    for (Iterator lIterator = components.iterator(); lIterator.hasNext();)
-    {
-      writePropertyMembers(out, (ComponentBean) lIterator.next());
-    }
-  }
-
-  public void writeReleaseMethod(PrettyWriter out,
-                                 ComponentBean component) throws IOException
-  {
-    Collection components = new HashSet();
-    components.add(component);
-    writeReleaseMethod(out, components);
-  }
-
-
-  public void writeReleaseMethod(
-    PrettyWriter out, Collection components) throws IOException
-  {
-    Collection all = new HashSet();
-    boolean special = false;
-    for (Iterator lIterator = components.iterator(); lIterator.hasNext();)
-    {
-      ComponentBean component = (ComponentBean) lIterator.next();
-      Iterator prop = component.properties();
-      // TODO: remove special case for UIXFormTag
-      special |= "org.apache.myfaces.trinidadinternal.taglib.UIXFormTag".equals(component.getTagClass());
-      while (prop.hasNext())
-      {
-        all.add(prop.next());
-      }
-    }
-
-    Iterator properties = all.iterator();
-    properties = new FilteredIterator(properties, new TagAttributeFilter());
-    if (properties.hasNext() || special)
-    {
-      out.println();
-      if (is12()){
-          out.println("@Override");
-      }
-      out.println("public void release()");
-      out.println("{");
-      out.indent();
-      out.println("super.release();");
-      while (properties.hasNext())
-      {
-        PropertyBean property = (PropertyBean) properties.next();
-        String propName = property.getPropertyName();
-        String propVar = "_" + propName;
-        out.print(propVar + " = ");
-        String type = GeneratorHelper.getJspPropertyType(property, is12());
-        // FIXME: support all primitive types.  In practice, the only types
-        // that have come up are ValueExpression, String, and boolean
-        if ("boolean".equals(type))
-          out.println("false;");
-        else
-          out.println("null;");
-      }
-      out.unindent();
-      out.println("}");
-    }
-  }
-
-  protected void addSpecificImports(
-      Set imports,
-      ComponentBean component)
-  {
-    // nothing by default
-  }
-
-  /**
-   * Returns true if the method is being used for generating JSF 1.2 code.
-   */
-  protected abstract boolean is12();
-
-  protected abstract void writePropertyDeclaration(PrettyWriter out,
-                                                   PropertyBean property) throws IOException;
-
-  protected abstract void writePropertySetter(PrettyWriter out,
-                                              PropertyBean property) throws IOException;
-
-  protected abstract void writeSetPropertyMethodBody(PrettyWriter out,
-                                                     String componentClass,
-                                                     Iterator properties) throws IOException;
-
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/AbstractConverterTagGenerator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/AbstractConverterTagGenerator.java
deleted file mode 100644
index 67436f9..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/AbstractConverterTagGenerator.java
+++ /dev/null
@@ -1,191 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.AbstractTagBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ConverterBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.FilteredIterator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-import org.apache.maven.plugin.logging.Log;
-
-import java.io.File;
-import java.io.StringWriter;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.Set;
-import java.util.Iterator;
-
-public abstract class AbstractConverterTagGenerator extends AbstractTagGenerator {
-  protected AbstractConverterTagGenerator(boolean is12, String licenseHeader, Log log) {
-    super(is12, licenseHeader, log);
-  }
-
-   public void generateTagHandler(
-    ConverterBean converter, File generatedSourceDirectory)
-  {
-    try
-    {
-      getLog().debug("Generating " + converter.getTagClass());
-
-      StringWriter sw = new StringWriter();
-      PrettyWriter out = new PrettyWriter(sw);
-
-      Set imports = createImports(converter);
-      writeHeader(out, converter, imports);
-
-      writeClass(out, converter);
-
-      writeConstructor(out, converter);
-
-      writePropertyMethods(out, converter);
-      writeDoStartTag(out, converter);
-      writeCreateConverter(out, converter);
-      writeSetProperties(out, converter);
-      writeRelease(out, converter);
-
-      writeEnd(out);
-      // delay write in case of error
-      // timestamp should not be updated when an error occurs
-      // delete target file first, because it is readonly
-      File targetFile = createFile(generatedSourceDirectory, converter.getTagClass());
-      targetFile.delete();
-      FileWriter fw = new FileWriter(targetFile);
-      StringBuffer buf = sw.getBuffer();
-      fw.write(buf.toString());
-      fw.close();
-      targetFile.setReadOnly();
-    }
-    catch (Throwable e)
-    {
-      getLog().error("Error generating " + converter.getTagClass(), e);
-    }
-  }
-
-  protected abstract Set createImports(ConverterBean converter);
-  protected abstract void writeSetProperty(PrettyWriter out, PropertyBean property);
-
-
-  private void writeSetProperties(
-    PrettyWriter  out,
-    ConverterBean converter) throws IOException
-  {
-    Iterator properties = converter.properties();
-    properties = new FilteredIterator(properties, new TagAttributeFilter());
-    if (properties.hasNext())
-    {
-      String converterFullClass = converter.getConverterClass();
-      String converterClass = Util.getClassFromFullClass(converterFullClass);
-      out.println();
-      out.println("private void _setProperties(");
-      out.indent();
-      out.println(converterClass + " converter) throws JspException");
-      out.unindent();
-      out.println("{");
-      out.indent();
-      while (properties.hasNext())
-      {
-        PropertyBean property = (PropertyBean)properties.next();
-        writeSetProperty(out, property);
-      }
-      out.unindent();
-      out.println("}");
-    }
-  }
-
-  protected void writeCreateConverter(
-    PrettyWriter  out,
-    ConverterBean converter) throws IOException
-  {
-    Iterator properties = converter.properties();
-    properties = new FilteredIterator(properties, new TagAttributeFilter());
-    if (properties.hasNext())
-    {
-      String converterFullClass = converter.getConverterClass();
-      String converterClass = Util.getClassFromFullClass(converterFullClass);
-
-      out.println();
-      // TODO: restore coding standards, and make final
-      if (is12()) {
-        out.println("@Override");
-      }
-      out.println("protected Converter createConverter() throws JspException");
-      out.println("{");
-      out.indent();
-      if (is12())
-      {
-        out.println("String converterId = " + converterClass +  ".CONVERTER_ID;");
-        out.println("Application appl = FacesContext.getCurrentInstance().getApplication();");
-        out.println(converterClass + " converter = " +
-                    "(" + converterClass + ")appl.createConverter(converterId);");
-      }
-      else
-      {
-        out.println(converterClass + " converter = " +
-                    "(" + converterClass + ")super.createConverter();");
-      }
-      out.println("_setProperties(converter);");
-      out.println("return converter;");
-      out.unindent();
-      out.println("}");
-    }
-  }
-
-
-  protected void writeDoStartTag(
-      PrettyWriter  out,
-      ConverterBean converter) throws IOException
-    {
-      if (!is12())
-      {
-        String converterFullClass = converter.getConverterClass();
-        String converterClass = Util.getClassFromFullClass(converterFullClass);
-
-        out.println();
-        // TODO: restore coding standards, and make final
-        out.println("@Override");
-        out.println("public int doStartTag() throws JspException");
-        out.println("{");
-        out.indent();
-        out.println("super.setConverterId(" + converterClass + ".CONVERTER_ID);");
-        out.println("return super.doStartTag();");
-        out.unindent();
-        out.println("}");
-      }
-    }
-
-
-  private void writeClass(PrettyWriter out, AbstractTagBean abstractTag) {
-    String className = Util.getClassFromFullClass(abstractTag.getTagClass());
-    if (is12())
-    {
-      out.println("public class " + className +
-                  " extends ConverterELTag");
-    }
-    else
-    {
-      out.println("public class " + className +
-                  " extends ConverterTag");
-    }
-
-    out.println("{");
-    out.indent();
-  }
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/AbstractTagGenerator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/AbstractTagGenerator.java
deleted file mode 100644
index 444fe2b..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/AbstractTagGenerator.java
+++ /dev/null
@@ -1,266 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.GeneratorHelper;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.AbstractTagBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.FilteredIterator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-import org.apache.maven.plugin.logging.Log;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Collections;
-
-public abstract class AbstractTagGenerator {
-  protected Log _log;
-  protected boolean _is12;
-  protected String _licenseHeader;
-  static final private String _AUTO_GENERATE_WARNING =
-"// WARNING: This file was automatically generated. Do not edit it directly,\n"+
-"//          or you will lose your changes.\n\n";
-
-  public AbstractTagGenerator(boolean is12, String licenseHeader, Log log) {
-    this._log = log;
-    this._licenseHeader = licenseHeader;
-    this._is12 = is12;
-  }
-
-  protected void writePreamble(
-    PrettyWriter out)
-  {
-    out.write(_AUTO_GENERATE_WARNING);
-    out.write(_licenseHeader);
-  }
-
-  protected Log getLog() {
-    return _log;
-  }
-
-  protected boolean is12() {
-    return _is12;
-  }
-
-  protected File createFile(File generatedSourceDirectory, String fullClassName) {
-     getLog().debug("Generating " + fullClassName);
-     String sourcePath = Util.convertClassToSourcePath(fullClassName, ".java");
-     File targetFile = new File(generatedSourceDirectory, sourcePath);
-
-     targetFile.getParentFile().mkdirs();
-     return targetFile;
-   }
-
-  protected void writeConstructor(
-      PrettyWriter  out,
-      AbstractTagBean abstractTag) throws IOException
-    {
-      String fullClassName = abstractTag.getTagClass();
-      String className = Util.getClassFromFullClass(fullClassName);
-      out.println();
-      out.println("/**");
-      // TODO: restore this correctly phrased comment (tense vs. command)
-      //out.println(" * Constructs an instance of " + className + ".");
-      out.println(" * Construct an instance of the " + className + ".");
-      out.println(" */");
-      out.println("public " + className + "()");
-      out.println("{");
-      out.println("}");
-    }
-
-  protected void writePropertyMethods(
-      PrettyWriter  out,
-      AbstractTagBean abstractTag) throws IOException
-    {
-      Iterator properties = abstractTag.properties();
-      properties = new FilteredIterator(properties, new TagAttributeFilter());
-      while (properties.hasNext())
-      {
-        PropertyBean property = (PropertyBean)properties.next();
-        out.println();
-        writePropertyMember(out, property);
-        writePropertySet(out, property);
-      }
-    }
-    private void writePropertyMember(
-   PrettyWriter  out,
-   PropertyBean  property) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String propVar = "_" + Util.getVariableFromName(propName);
-    String jspPropType = getJspPropertyType(property);
-
-    out.println("private " + jspPropType + " " + propVar + ";");
-  }
-
-  private void writePropertySet(
-   PrettyWriter  out,
-   PropertyBean  property) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String propVar = Util.getVariableFromName(propName);
-    String setMethod = Util.getPrefixedPropertyName("set", propName);
-    String jspPropType = getJspPropertyType(property);
-
-    // TODO: restore coding standards, and make final
-    out.println("public void " + setMethod + "(" + jspPropType + " " + propVar + ")");
-    out.println("{");
-    out.indent();
-    out.println("_" + propVar + " = " + propVar + ";");
-    out.unindent();
-    out.println("}");
-  }
-
-  protected void writeRelease(
-    PrettyWriter  out,
-    AbstractTagBean abstractTag) throws IOException
-  {
-    Iterator properties = abstractTag.properties();
-    properties = new FilteredIterator(properties, new TagAttributeFilter());
-    if (properties.hasNext())
-    {
-      out.println();
-      if (is12()) {
-        out.println("@Override");
-      }
-      out.println("public void release()");
-      out.println("{");
-      out.indent();
-      out.println("super.release();");
-      while (properties.hasNext())
-      {
-        PropertyBean property = (PropertyBean)properties.next();
-        String propName = property.getPropertyName();
-        String propVar = "_" + Util.getVariableFromName(propName);
-        out.println(propVar + " = null;");
-      }
-      out.unindent();
-      out.println("}");
-    }
-  }
-
-  private String getJspPropertyType(PropertyBean property)
-  {
-    if (property.isMethodExpression())
-      return "MethodExpression";
-
-    if (is12() && property.isMethodBinding())
-      return "MethodExpression";
-
-    if (is12() && !property.isLiteralOnly())
-      return "ValueExpression";
-    return "String";
-  }
-
-  protected void writeEnd(PrettyWriter out) {
-      out.unindent();
-      out.println("}");
-      out.close();
-    }
-
-  protected void writeImports(
-    PrettyWriter   out,
-    AbstractTagBean  abstractTagBean, Set imports)
-  {
-
-    // do not import implicit!
-    imports.removeAll(Util.PRIMITIVE_TYPES);
-
-    String packageName = Util.getPackageFromFullClass(abstractTagBean.getTagClass());
-    GeneratorHelper.writeImports(out, packageName, imports);
-  }
-
-  protected final void writeHeader(PrettyWriter out, AbstractTagBean converter, Set imports) {
-    String packageName = Util.getPackageFromFullClass(converter.getTagClass());
-    // header/copyright
-    writePreamble(out);
-
-    // package
-    out.println("package " + packageName + ";");
-
-    out.println();
-    writeImports(out, converter, imports);
-
-    out.println("/**");
-    // TODO: remove this blank line.
-    out.println();
-    out.println(" * Auto-generated tag class.");
-    out.println(" */");
-  }
-
-  protected void addImportsFromPropertes(AbstractTagBean abstractTagBean, Set imports) {
-    Iterator properties = abstractTagBean.properties();
-    properties = new FilteredIterator(properties, new TagAttributeFilter());
-
-    while (properties.hasNext())
-    {
-      PropertyBean property = (PropertyBean)properties.next();
-
-      String propertyClass = property.getPropertyClass();
-      if (propertyClass != null)
-        imports.add(propertyClass);
-
-      if ("java.lang.String[]".equals(propertyClass))
-      {
-        imports.add("java.text.ParseException");
-      }
-    }
-  }
-
-  protected String resolveDateType(String className, boolean useMaxTime)
-  {
-    String type = (String)_RESOLVABLE_TYPES.get(className);
-    return useMaxTime ? type + "WithMaxTime" : type;
-  }
-
-  protected String resolveType(String className)
-  {
-    return (String)_RESOLVABLE_TYPES.get(className);
-  }
-
-  // TODO: for everything but Locale, String[], Date, and TimeZone,
-  // in JSF 1.2 we should already be going through coercion, and
-  // not need any of the "TagUtils" functions
-  private Map _createResolvableTypes()
-  {
-    Map resolvableTypes = new HashMap();
-
-    resolvableTypes.put("boolean", "Boolean");
-    resolvableTypes.put("char", "Character");
-    resolvableTypes.put("java.util.Date", "Date");
-    resolvableTypes.put("int", "Integer");
-    resolvableTypes.put("float", "Float");
-    resolvableTypes.put("double", "Double");
-    resolvableTypes.put("java.util.Locale", "Locale");
-    resolvableTypes.put("long", "Long");
-    resolvableTypes.put("java.lang.String", "String");
-    resolvableTypes.put("java.lang.String[]", "StringArray");
-    resolvableTypes.put("java.util.TimeZone", "TimeZone");
-
-    return Collections.unmodifiableMap(resolvableTypes);
-  }
-
-  final private Map _RESOLVABLE_TYPES = _createResolvableTypes();
-
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/AbstractValidatorTagGenerator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/AbstractValidatorTagGenerator.java
deleted file mode 100644
index f30bc53..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/AbstractValidatorTagGenerator.java
+++ /dev/null
@@ -1,195 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.AbstractTagBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ValidatorBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.FilteredIterator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-import org.apache.maven.plugin.logging.Log;
-
-import java.io.File;
-import java.io.StringWriter;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.Set;
-import java.util.Iterator;
-
-public abstract class AbstractValidatorTagGenerator extends AbstractTagGenerator {
-
-  public AbstractValidatorTagGenerator(boolean is12, String licenseHeader, Log log) {
-    super(is12, licenseHeader, log);
-  }
-
-   public void generateTagHandler(
-    ValidatorBean validator, File generatedSourceDirectory)
-  {
-
-    try
-    {
-      getLog().debug("Generating " + validator.getTagClass());
-
-      StringWriter sw = new StringWriter();
-      PrettyWriter out = new PrettyWriter(sw);
-      Set imports = createImports(validator);
-      writeHeader(out, validator, imports);
-
-      writeClass(out, validator);
-
-      writeConstructor(out, validator);
-
-      writePropertyMethods(out, validator);
-      writeDoStartTag(out, validator);
-      writeCreateValidator(out, validator);
-      writeSetProperties(out, validator);
-      writeRelease(out, validator);
-
-      writeEnd(out);
-
-      // delay write in case of error
-      // timestamp should not be updated when an error occurs
-      // delete target file first, because it is readonly
-      File targetFile = createFile(generatedSourceDirectory, validator.getTagClass());
-      targetFile.delete();
-      FileWriter fw = new FileWriter(targetFile);
-      StringBuffer buf = sw.getBuffer();
-      fw.write(buf.toString());
-      fw.close();
-      targetFile.setReadOnly();
-    }
-    catch (Throwable e)
-    {
-      getLog().error("Error generating " + validator.getTagClass(), e);
-    }
-  }
-
-  protected abstract Set createImports(ValidatorBean validator);
-
-  protected void writeClass(PrettyWriter out, AbstractTagBean abstractTag) {
-    String className = Util.getClassFromFullClass(abstractTag.getTagClass());
-    if (is12())
-    {
-      out.println("public class " + className +
-                  " extends ValidatorELTag");
-    }
-    else
-    {
-      out.println("public class " + className +
-                  " extends ValidatorTag");
-    }
-
-    out.println("{");
-    out.indent();
-  }
-
-  private void writeDoStartTag(
-     PrettyWriter  out,
-     ValidatorBean validator) throws IOException
-   {
-     out.println();
-     if (!is12())
-     {
-       String validatorFullClass = validator.getValidatorClass();
-       String validatorClass = Util.getClassFromFullClass(validatorFullClass);
-
-       // TODO: restore coding standards, and make final
-       //out.println("@Override");
-       out.println("public int doStartTag() throws JspException");
-       out.println("{");
-       out.indent();
-       out.println("super.setValidatorId(" + validatorClass + ".VALIDATOR_ID);");
-       out.println("return super.doStartTag();");
-       out.unindent();
-       out.println("}");
-     }
-   }
-
-
-  private void writeCreateValidator(
-    PrettyWriter  out,
-    ValidatorBean validator) throws IOException
-  {
-    Iterator properties = validator.properties();
-    properties = new FilteredIterator(properties, new TagAttributeFilter());
-    if (properties.hasNext())
-    {
-      String validatorFullClass = validator.getValidatorClass();
-      String validatorClass = Util.getClassFromFullClass(validatorFullClass);
-
-      out.println();
-      // TODO: restore coding standards, and make final
-      if (is12()) {
-        out.println("@Override");
-      }
-      out.println("protected Validator createValidator() throws JspException");
-      out.println("{");
-      out.indent();
-      if (is12())
-      {
-        out.println("String validatorId = " + validatorClass + ".VALIDATOR_ID;");
-        out.println("Application appl = FacesContext.getCurrentInstance().getApplication();");
-        out.println(validatorClass + " validator = " +
-                    "(" + validatorClass + ")appl.createValidator(validatorId);");
-      }
-      else
-      {
-        out.println(validatorClass + " validator = " +
-                    "(" + validatorClass + ")super.createValidator();");
-      }
-      out.println("_setProperties(validator);");
-      out.println("return validator;");
-      out.unindent();
-      out.println("}");
-    }
-  }
-
-  private void writeSetProperties(
-      PrettyWriter  out,
-      ValidatorBean validator) throws IOException
-    {
-      Iterator properties = validator.properties();
-      properties = new FilteredIterator(properties, new TagAttributeFilter());
-      if (properties.hasNext())
-      {
-        String validatorFullClass = validator.getValidatorClass();
-        String validatorClass = Util.getClassFromFullClass(validatorFullClass);
-        out.println();
-        out.println("private void _setProperties(");
-        out.indent();
-        out.println(validatorClass + " validator) throws JspException");
-        out.unindent();
-        out.println("{");
-        out.indent();
-        while (properties.hasNext())
-        {
-          PropertyBean property = (PropertyBean)properties.next();
-          writeSetProperty(out, property);
-        }
-        out.unindent();
-        out.println("}");
-      }
-    }
-
-  protected abstract void writeSetProperty(
-     PrettyWriter out,
-     PropertyBean property);
-
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/ComponentTagGenerator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/ComponentTagGenerator.java
deleted file mode 100644
index f46c470..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/ComponentTagGenerator.java
+++ /dev/null
@@ -1,62 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.ClassGenerator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ComponentBean;
-
-import java.io.IOException;
-import java.util.Collection;
-
-/**
- * Generates tag classes
- *
- * @author Bruno Aranda (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-public interface ComponentTagGenerator extends ClassGenerator
-{
-
-  void writeSetPropertiesMethod(PrettyWriter out,
-                                String componentClass,
-                                ComponentBean component) throws IOException;
-
-  void writeSetPropertiesMethod(PrettyWriter out,
-                                String componentClass,
-                                Collection components) throws IOException;
-
-  void writeReleaseMethod(PrettyWriter out,
-                          ComponentBean component) throws IOException;
-
-  void writeReleaseMethod(PrettyWriter out,
-                          Collection components) throws IOException;
-
-  void writeGetComponentType(PrettyWriter out,
-                             ComponentBean component) throws IOException;
-
-  void writeGetRendererType(PrettyWriter out,
-                            ComponentBean component) throws IOException;
-
-  void writePropertyMembers(PrettyWriter out,
-                            ComponentBean component) throws IOException;
-
-  void writePropertyMembers(PrettyWriter out,
-                            Collection components) throws IOException;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/MyFacesComponentTagGenerator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/MyFacesComponentTagGenerator.java
deleted file mode 100644
index 54f1cec..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/MyFacesComponentTagGenerator.java
+++ /dev/null
@@ -1,636 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.GeneratorHelper;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ComponentBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.MethodSignatureBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.FilteredIterator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * Component tag generator for myfaces
- *
- * @author Bruno Aranda (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-public class MyFacesComponentTagGenerator extends AbstractComponentTagGenerator
-{
-  private boolean _is12;
-
-  public MyFacesComponentTagGenerator(boolean is12)
-  {
-    _is12 = is12;
-  }
-  
-  protected boolean is12()
-  {
-    return _is12;
-  }
-
-  protected void addSpecificImports(Set imports,
-                                    ComponentBean component)
-  {
-    imports.add("javax.faces.component.UIComponent");
-    imports.add(component.getComponentClass());
-
-    if (_is12)
-    {
-      imports.add("javax.el.ValueExpression");
-    }
-    else
-    {
-      imports.add("javax.faces.el.ValueBinding");
-      imports.add("javax.faces.context.FacesContext");
-    }
-        
-
-    Iterator properties = component.properties();
-    properties = new FilteredIterator(properties, new TagAttributeFilter());
-
-    while (properties.hasNext())
-    {
-      PropertyBean property = (PropertyBean) properties.next();
-      String propertyClass = property.getPropertyClass();
-
-      if (GeneratorHelper.isConverter(propertyClass))
-      {
-        if (!_is12)
-        {
-          imports.add("javax.faces.el.ValueBinding");
-        }
-        imports.add("javax.faces.convert.Converter");
-      }
-      else if (property.isMethodBinding())
-      {
-        if (_is12)
-        {
-          imports.add("javax.el.MethodExpression");
-          if (GeneratorHelper.isActionListener(property, _is12))
-          {
-            imports.add("javax.faces.event.MethodExpressionActionListener");
-          }
-          if (GeneratorHelper.isValueChangeListener(property, _is12))
-          {
-            imports.add("javax.faces.event.MethodExpressionValueChangeListener");
-          }
-          if (GeneratorHelper.isValidator(property, _is12))
-          {
-            imports.add("javax.faces.validator.MethodExpressionValidator");
-          }
-        }
-        else
-        {
-          imports.add("javax.faces.el.MethodBinding");
-        }
-      }
-      else if (property.isMethodExpression())
-      {
-        imports.add("javax.el.MethodExpression");
-      }
-      else if (GeneratorHelper.isActionListener(property, _is12))
-      {
-        imports.add("javax.faces.event.MethodExpressionActionListener");
-      }
-      else if (GeneratorHelper.isValueChangeListener(property, _is12))
-      {
-        imports.add("javax.faces.event.MethodExpressionValueChangeListener");
-      }
-      else if (GeneratorHelper.isValidator(property, _is12))
-      {
-        imports.add("javax.faces.validator.MethodExpressionValidator");
-      }
-    }
-  }
-
-
-  protected void writePropertyDeclaration(PrettyWriter out,
-                                          PropertyBean property) throws IOException
-  {
-    String fieldPropName = property.getFieldPropertyName();
-    String jspPropType = GeneratorHelper.getJspPropertyType(property, _is12);
-
-    out.println();
-    out.println("private " + jspPropType + " " + fieldPropName + ";");
-  }
-
-  protected void writePropertySetter(PrettyWriter out,
-                                     PropertyBean property) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String fieldPropName = property.getFieldPropertyName();
-    String jspPropName = property.getJspPropertyName();
-    String propVar = Util.getVariableFromName(propName);
-    String setMethod = Util.getPrefixedPropertyName("set", jspPropName);
-    String jspPropType = GeneratorHelper.getJspPropertyType(property, _is12);
-
-    out.println("public void " + setMethod + "(" + jspPropType + " " + propVar + ")");
-    out.println("{");
-    out.indent();
-    out.println(fieldPropName + " = " + propVar + ";");
-    out.unindent();
-    out.println("}");
-  }
-
-  public void writeGetComponentType(PrettyWriter out,
-                                    ComponentBean component) throws IOException
-  {
-    String componentType = component.getComponentType();
-    if("javax.faces.HtmlColumn".equals(componentType))
-    {
-      componentType = "javax.faces.Column";
-    }
-    out.println();
-
-    // The superclass does not necessarily need to have this method
-    if (is12()){
-        out.println("@Override");
-    }
-    out.println("public String getComponentType()");
-    out.println("{");
-    out.indent();
-    out.println("return \"" + componentType + "\";");
-    out.unindent();
-    out.println("}");
-  }
-
-  public void writeSetPropertiesMethod(PrettyWriter out,
-                                       String componentClass,
-                                       ComponentBean component) throws IOException
-  {
-    Collection components = new HashSet();
-    components.add(component);
-    writeSetPropertiesMethod(out, componentClass, components);
-  }
-
-
-  public void writeSetPropertiesMethod(PrettyWriter out, String componentClass, Collection components)
-      throws IOException
-  {
-
-    Collection all = new HashSet();
-    for (Iterator lIterator = components.iterator(); lIterator.hasNext();)
-    {
-      ComponentBean component = (ComponentBean) lIterator.next();
-      Iterator prop = component.properties();
-      while (prop.hasNext())
-      {
-        all.add(prop.next());
-      }
-    }
-
-    Iterator properties = all.iterator();
-    properties = new FilteredIterator(properties, new TagAttributeFilter());
-
-    out.println();
-
-    if (_is12)
-    {
-      out.println("@Override");
-    }
-    out.println("protected void setProperties(UIComponent component)");
-    out.unindent();
-    out.println("{");
-    out.indent();
-
-    writeSetPropertyMethodBody(out, componentClass, properties);
-    out.unindent();
-    out.println("}");
-  }
-
-  protected void writeSetPropertyMethodBody(PrettyWriter out,
-                                            String componentClass,
-                                            Iterator properties) throws IOException
-  {
-
-    if("HtmlColumn".equals(componentClass))
-    {
-        componentClass = "UIColumn";
-    }
-
-    out.println("if (!(component instanceof " + componentClass + "))");
-    out.println("{");
-    out.indent();
-    out.print("throw new IllegalArgumentException(");
-    out.print("\"Component \" + component.getClass().getName() + \" is no " + componentClass + "\"");
-    out.println(");");
-    out.unindent();
-    out.println("}");
-
-    out.println(componentClass + " comp = (" + componentClass + ")component;");
-
-    out.println();
-    out.println("super.setProperties(component);");
-    out.println();
-
-    if (!_is12)
-    {
-      out.println("FacesContext context = getFacesContext();");
-    }
-
-    while (properties.hasNext())
-    {
-      PropertyBean property = (PropertyBean) properties.next();
-      _writeSetPropertiesCase(out, componentClass, property);
-    }
-  }
-
-  private void _writeSetPropertiesCase(
-      PrettyWriter out,
-      String componentClass,
-      PropertyBean property) throws IOException
-  {
-
-    if (property.isMethodBinding())
-    {
-      _writeSetMethodBinding(out, componentClass, property);
-    }
-    else if (property.isMethodExpression())
-    {
-      _writeSetMethodExpression(out, componentClass, property);
-    }
-    else if (GeneratorHelper.isConverter(property.getPropertyClass()))
-    {
-      _writeSetConverter(out, componentClass, property.getPropertyName());
-    }
-    else
-    {
-      _writeSetProperty(out, property);
-    }
-  }
-
-  private void _writeSetProperty(
-      PrettyWriter out,
-      PropertyBean property)
-  {
-    String propName = property.getPropertyName();
-    String propVar = "_" + propName;
-    
-    out.println("if (" + propVar + " != null) ");
-    out.println("{");
-    out.indent();
-
-    if (property.isLiteralOnly())
-    {
-      if (_is12){
-          out.println("comp.getAttributes().put(\"" + propName + "\", " + propVar + ");");
-      }else{
-          String propertyClass = property.getPropertyClass().trim();
-          if (propertyClass.startsWith("java.lang.")){
-              propertyClass = propertyClass.replace("java.lang.", "");
-          }
-          
-          if (propertyClass.endsWith("eger")){
-              propertyClass = propertyClass.replace("eger", "");
-          }
-          
-          if (Util.isPrimitiveClass(propertyClass.toLowerCase())){
-              out.println("comp.getAttributes().put(\"" + propName + "\", " +
-                      Util.getBoxedClass(propertyClass.toLowerCase())+".valueOf(" + propVar + "));");                
-          }else{                
-              out.println("comp.getAttributes().put(\"" + propName + "\", " + propVar + ");");
-          }
-      }
-      
-    }
-    else if (_is12)
-    {
-      out.println("comp.setValueExpression(\"" + propName + "\", " + propVar + ");");
-    }
-    else
-    {
-      _writeSetValueBinding(out, property, propName, propVar);
-    }
-    out.unindent();
-    out.println("}");
-  }
-
-  private void _writeSetValueBinding(
-      PrettyWriter out,
-      PropertyBean property,
-      String propName,
-      String propVar)
-  {
-    out.println("if (isValueReference(" + propVar + "))");
-    out.println("{");
-    out.indent();
-    out.println("ValueBinding vb = context.getApplication().createValueBinding(" + propVar + ");");
-    out.println("comp.setValueBinding(\"" + propName + "\", vb);");
-    out.unindent();
-    out.println("}");
-    out.println("else");
-    out.println("{");
-    out.indent();
-    if (!is12() && "value".equals(propName))
-    {
-        out.println("comp.setValue(" + propVar + ");");
-    }
-    else
-    {
-        if (Util.isPrimitiveClass(property.getPropertyClass())){
-            out.println("comp.getAttributes().put(\"" + propName + "\", " +
-                    Util.getBoxedClass(property.getPropertyClass())+".valueOf(" + propVar + "));");
-        }else{
-            String propertyClass = property.getPropertyClass().trim();
-            if (propertyClass.startsWith("java.lang.")){
-                propertyClass = propertyClass.replace("java.lang.", "");
-            }
-            
-            if (propertyClass.endsWith("eger")){
-                propertyClass = propertyClass.replace("eger", "");
-            }
-            
-            if (Util.isPrimitiveClass(propertyClass.toLowerCase())){
-                out.println("comp.getAttributes().put(\"" + propName + "\", " +
-                        Util.getBoxedClass(propertyClass.toLowerCase())+".valueOf(" + propVar + "));");                
-            }else{                
-                out.println("comp.getAttributes().put(\"" + propName + "\", " + propVar + ");");
-                
-            }
-        }
-    }    
-    out.unindent();
-    out.println("}");
-  }
-
-
-  private void _writeSetMethodBinding(
-      PrettyWriter out,
-      String componentClass,
-      PropertyBean property) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-    String propVar = "_" + propName;
-
-    if (_is12)
-    {
-      out.println("if (" + propVar + " != null)");
-      out.println("{");
-      out.indent();
-      if (GeneratorHelper.isActionListener(property, _is12))
-      {
-        out.println("comp.addActionListener(new MethodExpressionActionListener(" + propVar + "));");
-      }
-      else if (GeneratorHelper.isValueChangeListener(property, _is12))
-      {
-        out.println("comp.addValueChangeListener(new MethodExpressionValueChangeListener(" + propVar + "));");
-      }
-      else if (GeneratorHelper.isValidator(property, _is12))
-      {
-        out.println("comp.addValidator(new MethodExpressionValidator(" + propVar + "));");
-      }
-      else
-      {
-        out.println("bean.setProperty(" + componentClass + "." + propKey + ", " +
-            "new MethodExpressionMethodBinding(" + propVar + "));");
-      }
-      out.unindent();
-      out.println("}");
-    }
-    else
-    {
-      MethodSignatureBean signature = property.getMethodBindingSignature();
-      String[] paramTypes = (signature != null) ? signature.getParameterTypes() : null;
-
-      String classArray;
-
-      if (paramTypes == null || paramTypes.length == 0)
-      {
-        classArray = "new Class[0]";
-      }
-      else
-      {
-        StringBuffer sb = new StringBuffer();
-        sb.append("new Class[]{");
-        for (int i = 0; i < paramTypes.length; i++)
-        {
-          if (i > 0)
-            sb.append(',');
-          sb.append(paramTypes[i]);
-          sb.append(".class");
-        }
-
-        // TODO: remove trailing comma
-        sb.append(',');
-
-        sb.append('}');
-        classArray = sb.toString();
-      }
-
-      out.println("if (" + propVar + " != null)");
-      out.println("{");
-      out.indent();
-
-      if (isStringMethodBindingReturnType(signature) || property.getJspPropertyName().equals("action"))
-      {
-        out.println("MethodBinding mb;");
-        out.println("if (isValueReference(" + propVar + "))");
-        out.indent();
-        out.println("mb = context.getApplication().createMethodBinding(" + propVar + ", " + classArray + ");");
-        out.unindent();
-        out.println("else");
-        out.indent();
-        
-        if (!is12() && property.getJspPropertyName().equals("action")){
-            out.println("mb = new org.apache.myfaces.shared_tomahawk.el.SimpleActionMethodBinding("+propVar+");");
-        }else{
-            out.println("throw new IllegalStateException(\"Invalid expression \" + "+propVar+");");
-        }
-        out.unindent();
-      }
-      else
-      {
-        // never a literal, no need for ConstantMethodBinding
-        out.println("MethodBinding mb = context.getApplication().createMethodBinding(" + propVar + ", " +
-            classArray + ");");
-      }
-      String setMethod = Util.getPrefixedPropertyName("set", propName);
-      
-      out.println("comp."+setMethod+"(mb);");
-      out.unindent();
-      out.println("}");
-    }
-  }
-
-  private void _writeSetMethodExpression(
-      PrettyWriter out,
-      String componentClass,
-      PropertyBean property) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String propVar = property.getFieldPropertyName();
-
-    out.println("if (" + propVar + " != null) ");
-    out.println("{");
-    out.indent();
-
-    if (GeneratorHelper.isAction(property))
-    {
-      out.println("comp.setActionExpression(" + propVar + ");");
-    }
-    else if (GeneratorHelper.isActionListener(property, _is12))
-    {
-      out.println("comp.addActionListener(new MethodExpressionActionListener(" + propVar + "));");
-    }
-    else
-    {
-      out.println("comp." + Util.getPrefixedPropertyName("set", propName) + "(" + propVar + ");");
-    }
-    out.unindent();
-    out.println("}");
-  }
-
-  private void _writeSetKeyStroke(
-      PrettyWriter out,
-      String componentClass,
-      String propName) throws IOException
-  {
-    String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-    String propVar = "_" + propName;
-
-
-    if (_is12)
-    {
-      out.println("if (" + propVar + " != null)");
-      out.println("{");
-      out.indent();
-      out.println("if (!" + propVar + ".isLiteralText())");
-      out.println("{");
-      out.indent();
-      out.println("bean.setValueExpression(" + componentClass + "." + propKey + ", " + propVar + ");");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("Object val = " + propVar + ".getValue(null);");
-      out.println("if (val != null)");
-      out.indent();
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
-      out.println("\tKeyStroke.getKeyStroke(val.toString()));");
-      out.unindent();
-      out.unindent();
-      out.println("}");
-      out.unindent();
-      out.println("}");
-    }
-    else
-    {
-      out.println("if (" + propVar + " != null)");
-      out.println("{");
-      out.indent();
-      out.println("if (isValueReference(" + propVar + "))");
-      out.println("{");
-      out.indent();
-      out.println("ValueBinding vb = createValueBinding(" + propVar + ");");
-      out.println("bean.setValueBinding(" + componentClass + "." + propKey + ", vb);");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
-      out.println("\tKeyStroke.getKeyStroke(" + propVar + "));");
-      out.unindent();
-      out.println("}");
-      out.unindent();
-      out.println("}");
-    }
-  }
-
-  private void _writeSetConverter(
-      PrettyWriter out,
-      String componentClass,
-      String propName) throws IOException
-  {
-    String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-    String propVar = "_" + propName;
-
-    out.println("if (" + propVar + " != null)");
-    out.println("{");
-    out.indent();
-
-    if (_is12)
-    {
-      out.println("if (!" + propVar + ".isLiteralText())");
-      out.println("{");
-      out.indent();
-      out.println("comp.setValueExpression(\"" + propName + "\", " + propVar + ");");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("String s = " + propVar + ".getExpressionString();");
-      out.println("if (s != null)");
-      out.println("{");
-
-      out.indent();
-      out.println("Converter converter = getFacesContext().getApplication().");
-      out.indent();
-      out.println("createConverter(s);");
-      out.unindent();
-      out.println("comp.setConverter(converter);");
-
-      out.unindent();
-      out.println("}");
-
-      out.unindent();
-      out.println("}");
-    }
-    else
-    {
-      out.println("if (isValueReference(" + propVar + "))");
-      out.println("{");
-      out.indent();
-      out.println("ValueBinding vb = context.getApplication().createValueBinding(" + propVar + ");");
-      out.println("comp.setValueBinding(\"" +propName+ "\", vb);");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("Converter converter = getFacesContext().getApplication().");
-      out.indent();
-      out.println("createConverter(" + propVar + ");");
-      out.unindent();
-      out.println("comp.setConverter(converter);");
-      out.unindent();
-      out.println("}");
-    }
-    out.unindent();
-    out.println("}");
-  }
-
-  private boolean isStringMethodBindingReturnType(
-      MethodSignatureBean sig)
-  {
-    return (sig != null && "java.lang.String".equals(sig.getReturnType()));
-  }
-
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/MyFacesConverterTagGenerator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/MyFacesConverterTagGenerator.java
deleted file mode 100644
index 218d955..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/MyFacesConverterTagGenerator.java
+++ /dev/null
@@ -1,167 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib;
-
-import org.apache.maven.plugin.logging.Log;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ConverterBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-
-import java.util.Set;
-import java.util.TreeSet;
-
-public class MyFacesConverterTagGenerator extends AbstractConverterTagGenerator {
-
-  public MyFacesConverterTagGenerator(boolean is12, String licenseHeader, Log log) {
-    super(is12, licenseHeader, log);
-  }
-
-  protected Set createImports(ConverterBean converter) {
-    Set imports = new TreeSet();
-
-    if (is12())
-    {
-      imports.add("javax.faces.webapp.ConverterELTag");
-      imports.add("javax.faces.context.FacesContext");
-      imports.add("javax.faces.application.Application");
-    }
-    else
-    {
-      imports.add("javax.faces.webapp.ConverterTag");
-    }
-
-    imports.add("javax.servlet.jsp.JspException");
-    imports.add(converter.getConverterClass());
-
-    imports.add("javax.faces.convert.Converter");
-    if (is12())
-    {
-      imports.add("javax.el.ValueExpression");
-    }
-    else
-    {
-      imports.add("javax.faces.el.ValueBinding");
-    }
-    imports.add("org.apache.myfaces.commons.util.TagUtils");
-
-
-    addImportsFromPropertes(converter, imports);
-    return imports;
-  }
-
-
-
-
-  protected void writeSetProperty(
-    PrettyWriter out,
-    PropertyBean property)
-  {
-    String propName = property.getPropertyName();
-    String propFullClass = property.getPropertyClass();
-    String propClass = Util.getClassFromFullClass(propFullClass);
-    String propVar = "_" + Util.getVariableFromName(propName);
-
-    out.println("if (" + propVar + " != null)");
-    out.println("{");
-    out.indent();
-
-    if (is12())
-    {
-      out.println("if (!" + propVar + ".isLiteralText())");
-      out.println("{");
-      out.indent();
-      out.println("converter.setValueExpression(\"" + propName + "\", " +
-                  propVar + ");");
-      out.unindent();
-      out.println("}");
-      String propType = resolveType(propFullClass);
-      if (propType != null)
-      {
-        out.println("else");
-        out.println("{");
-        out.indent();
-        if ("StringArray".equals(propType))
-        {
-          out.println("try");
-          out.println("{");
-        }
-
-        out.println(propClass + " value = TagUtils.get" + propType + "(" + propVar + ".getValue(null));");
-        String setMethod = Util.getPrefixedPropertyName("set", propName);
-        out.println("converter." + setMethod + "(value);");
-        if ("StringArray".equals(propType))
-        {
-          out.println("}");
-          out.println("catch (ParseException pe)");
-          out.println("{");
-          out.indent();
-          out.println("throw new JspException(");
-          out.println("  pe.getMessage() + \": \" + \"Position \" + pe.getErrorOffset());");
-          out.unindent();
-          out.println("}");
-        }
-        out.unindent();
-        out.println("}");
-      }
-    }
-    else
-    {
-      out.println("if (TagUtils.isValueReference(" + propVar + "))");
-      out.println("{");
-      out.indent();
-      out.println("ValueBinding vb = TagUtils.getValueBinding(" + propVar + ");");
-      out.println("converter.setValueBinding(\"" + propName + "\", vb);");
-      out.unindent();
-      out.println("}");
-      String propType = resolveType(propFullClass);
-      if (propType != null)
-      {
-        out.println("else");
-        out.println("{");
-        out.indent();
-        if ("StringArray".equals(propType))
-        {
-          out.println("try");
-          out.println("{");
-        }
-        out.println(propClass + " value = TagUtils.get" + propType + "(" + propVar + ");");
-        String setMethod = Util.getPrefixedPropertyName("set", propName);
-        out.println("converter." + setMethod + "(value);");
-        if ("StringArray".equals(propType))
-        {
-          out.println("}");
-          out.println("catch (ParseException pe)");
-          out.println("{");
-          out.indent();
-          out.println("throw new JspException(");
-          out.println("  pe.getMessage() + \": \" + \"Position \" + pe.getErrorOffset());");
-          out.unindent();
-          out.println("}");
-        }
-        out.unindent();
-        out.println("}");
-      }
-    }
-
-    out.unindent();
-    out.println("}");
-  }
-
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/MyFacesValidatorTagGenerator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/MyFacesValidatorTagGenerator.java
deleted file mode 100644
index 4f35533..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/MyFacesValidatorTagGenerator.java
+++ /dev/null
@@ -1,161 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib;
-
-import org.apache.maven.plugin.logging.Log;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ValidatorBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-
-import java.util.Set;
-import java.util.TreeSet;
-
-public class MyFacesValidatorTagGenerator extends AbstractValidatorTagGenerator {
-
-  public MyFacesValidatorTagGenerator(boolean is12, String licenseHeader, Log log) {
-    super(is12, licenseHeader, log);
-  }
-
-  protected Set createImports(ValidatorBean validator) {
-    Set imports = new TreeSet();
-
-    if (is12())
-    {
-      imports.add("javax.faces.webapp.ValidatorELTag");
-      imports.add("javax.faces.context.FacesContext");
-      imports.add("javax.faces.application.Application");
-    }
-    else
-    {
-      imports.add("javax.faces.webapp.ValidatorTag");
-    }
-    imports.add("javax.servlet.jsp.JspException");
-    imports.add(validator.getValidatorClass());
-
-    imports.add("javax.faces.validator.Validator");
-
-    if (is12())
-    {
-      imports.add("javax.el.ValueExpression");
-    }
-    else
-    {
-      imports.add("javax.faces.el.ValueBinding");
-    }
-    imports.add("org.apache.myfaces.commons.util.TagUtils");
-
-
-    addImportsFromPropertes(validator, imports);
-    return imports;
-  }
-
-  protected void writeSetProperty(
-    PrettyWriter out,
-    PropertyBean property)
-  {
-    String propName = property.getPropertyName();
-    String propFullClass = property.getPropertyClass();
-    String propClass = Util.getClassFromFullClass(propFullClass);
-    String propVar = "_" + Util.getVariableFromName(propName);
-    out.println("if (" + propVar + " != null)");
-    out.println("{");
-    out.indent();
-    if (is12())
-    {
-      out.println("if (!" + propVar + ".isLiteralText())");
-      out.println("{");
-      out.indent();
-      out.println("validator.setValueExpression(\"" + propName + "\", " +
-                  propVar + ");");
-      out.unindent();
-      out.println("}");
-      String propType = resolveType(propFullClass);
-      if (propType != null)
-      {
-        out.println("else");
-        out.println("{");
-        out.indent();
-        if ("StringArray".equals(propType))
-        {
-          out.println("try");
-          out.println("{");
-        }
-
-        out.println(propClass + " value = TagUtils.get" + propType + "(" + propVar + ".getValue(null));");
-        String setMethod = Util.getPrefixedPropertyName("set", propName);
-        out.println("validator." + setMethod + "(value);");
-        if ("StringArray".equals(propType))
-        {
-          out.println("}");
-          out.println("catch (ParseException pe)");
-          out.println("{");
-          out.indent();
-          out.println("throw new JspException(");
-          out.println("  pe.getMessage() + \": \" + \"Position \" + pe.getErrorOffset());");
-          out.unindent();
-          out.println("}");
-        }
-        out.unindent();
-        out.println("}");
-      }
-    }
-    else
-    {
-      out.println("if (TagUtils.isValueReference(" + propVar + "))");
-      out.println("{");
-      out.indent();
-      out.println("ValueBinding vb = TagUtils.getValueBinding(" + propVar + ");");
-      out.println("validator.setValueBinding(\"" + propName + "\", vb);");
-      out.unindent();
-      out.println("}");
-      String propType = resolveType(propFullClass);
-      if (propType != null)
-      {
-        out.println("else");
-        out.println("{");
-        out.indent();
-        if ("StringArray".equals(propType))
-        {
-          out.println("try");
-          out.println("{");
-        }
-        out.println(propClass + " value = TagUtils.get" + propType + "(" + propVar + ");");
-        String setMethod = Util.getPrefixedPropertyName("set", propName);
-        out.println("validator." + setMethod + "(value);");
-        if ("StringArray".equals(propType))
-        {
-          out.println("}");
-          out.println("catch (ParseException pe)");
-          out.println("{");
-          out.indent();
-          out.println("throw new JspException(");
-          out.println("  pe.getMessage() + \": \" + \"Position \" + pe.getErrorOffset());");
-          out.unindent();
-          out.println("}");
-        }
-        out.unindent();
-        out.println("}");
-      }
-    }
-
-    out.unindent();
-    out.println("}");
-  }
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/TagAttributeFilter.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/TagAttributeFilter.java
deleted file mode 100644
index d91c387..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/TagAttributeFilter.java
+++ /dev/null
@@ -1,37 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.PropertyFilter;
-
-/**
- * TODO: comment this!
- *
- * @author Bruno Aranda (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-final public class TagAttributeFilter extends PropertyFilter
-{
-  protected boolean accept(
-      PropertyBean property)
-  {
-    return (!property.isTagAttributeExcluded());
-  }
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/TrinidadComponentTagGenerator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/TrinidadComponentTagGenerator.java
deleted file mode 100644
index af7adc1..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/TrinidadComponentTagGenerator.java
+++ /dev/null
@@ -1,899 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.generator.GeneratorHelper;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ComponentBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.MethodSignatureBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.FilteredIterator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * TODO: comment this!
- *
- * @author Bruno Aranda (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-public class TrinidadComponentTagGenerator extends AbstractComponentTagGenerator
-{
-  private boolean _is12;
-
-  public TrinidadComponentTagGenerator(boolean is12)
-  {
-    _is12 = is12;
-  }
-
-  protected boolean is12()
-  {
-    return _is12;
-  }
-
-  protected void addSpecificImports(Set imports,
-                                    ComponentBean component)
-  {
-    imports.add("org.apache.myfaces.trinidad.bean.FacesBean");
-
-    if (_is12)
-    {
-      imports.add("javax.el.ValueExpression");
-    }
-
-    Iterator properties = component.properties();
-    properties = new FilteredIterator(properties, new TagAttributeFilter());
-
-    while (properties.hasNext())
-    {
-      PropertyBean property = (PropertyBean) properties.next();
-      String propertyClass = property.getPropertyClass();
-      String[] propertyClassParams = property.getPropertyClassParameters();
-
-      imports.add(component.getComponentClass());
-
-      if (GeneratorHelper.isKeyStroke(propertyClass))
-      {
-        if (_is12)
-          imports.add("javax.el.ValueExpression");
-        else
-          imports.add("javax.faces.el.ValueBinding");
-        imports.add("javax.swing.KeyStroke");
-      }
-      else if (GeneratorHelper.isAWTKeyStroke(propertyClass))
-      {
-        if (_is12)
-          imports.add("javax.el.ValueExpression");
-        else
-          imports.add("javax.faces.el.ValueBinding");
-        imports.add("java.awt.AWTKeyStroke");
-      }
-      else if (GeneratorHelper.isConverter(propertyClass))
-      {
-        if (_is12)
-          imports.add("javax.el.ValueExpression");
-        else
-          imports.add("javax.faces.el.ValueBinding");
-        imports.add("javax.faces.convert.Converter");
-      }
-      else if (property.isVirtual())
-      {
-        if (_is12)
-          imports.add("javax.el.ValueExpression");
-        else
-          imports.add("javax.faces.el.ValueBinding");
-        imports.add("org.apache.myfaces.trinidadinternal.taglib.util.VirtualAttributeUtils");
-      }
-      else if (GeneratorHelper.isColorList(propertyClass, propertyClassParams) ||
-               GeneratorHelper.isColor(propertyClass))
-      {
-        if (_is12)
-          imports.add("javax.el.ValueExpression");
-        else
-          imports.add("javax.faces.el.ValueBinding");
-        imports.add("java.text.ParseException");
-        imports.add("org.apache.myfaces.trinidadinternal.taglib.util.TagUtils");
-      }
-      else if (property.isMethodBinding())
-      {
-        if (_is12)
-        {
-          imports.add("javax.el.MethodExpression");
-          imports.add("org.apache.myfaces.trinidadinternal.taglib.util.MethodExpressionMethodBinding");
-        }
-        else
-        {
-          imports.add("javax.faces.el.MethodBinding");
-        }
-      }
-      else if (property.isMethodExpression())
-      {
-        imports.add("javax.el.MethodExpression");
-      }
-      else if (property.isEnum())
-      {
-        imports.add(propertyClass);
-      }
-    }
-  }
-
-
-  protected void writePropertyDeclaration(PrettyWriter out,
-                                          PropertyBean property) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String fieldPropName = "_" + propName;
-    String jspPropType = GeneratorHelper.getJspPropertyType(property, _is12);
-
-    out.println();
-    out.println("private " + jspPropType + " " + fieldPropName + ";");
-  }
-
-  protected void writePropertySetter(PrettyWriter out,
-                                     PropertyBean property) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String fieldPropName = "_" + propName;
-    String jspPropName = property.getJspPropertyName();
-    String propVar = Util.getVariableFromName(propName);
-    String setMethod = Util.getPrefixedPropertyName("set", jspPropName);
-    String jspPropType = GeneratorHelper.getJspPropertyType(property, _is12);
-
-    out.print("final ");
-    out.println("public void " + setMethod + "(" + jspPropType + " " + propVar + ")");
-    out.println("{");
-    out.indent();
-    out.println(fieldPropName + " = " + propVar + ";");
-    out.unindent();
-    out.println("}");
-  }
-
-  public void writeSetPropertiesMethod(PrettyWriter out,
-                                       String componentClass,
-                                       ComponentBean component) throws IOException
-  {
-    Collection components = new HashSet();
-    components.add(component);
-    writeSetPropertiesMethod(out, componentClass, components);
-  }
-
-
-  public void writeSetPropertiesMethod(PrettyWriter out, String componentClass, Collection components)
-      throws IOException
-  {
-    Collection all = new HashSet();
-    for (Iterator lIterator = components.iterator(); lIterator.hasNext();)
-    {
-      ComponentBean component = (ComponentBean) lIterator.next();
-      Iterator prop = component.properties();
-      while (prop.hasNext())
-      {
-        all.add(prop.next());
-      }
-    }
-
-    Iterator properties = all.iterator();
-    properties = new FilteredIterator(properties, new TagAttributeFilter());
-
-    if (properties.hasNext())
-    {
-      out.println();
-      out.println("@Override");
-      out.println("protected void setProperties(");
-      out.indent();
-      out.println("FacesBean bean)");
-      out.unindent();
-      out.println("{");
-      out.indent();
-
-      writeSetPropertyMethodBody(out, componentClass, properties);
-      out.unindent();
-      out.println("}");
-    }
-  }
-
-  protected void writeSetPropertyMethodBody(PrettyWriter out,
-                                            String componentClass,
-                                            Iterator properties) throws IOException
-  {
-
-    out.println("super.setProperties(bean);");
-
-    while (properties.hasNext())
-    {
-      PropertyBean property = (PropertyBean) properties.next();
-      _writeSetPropertiesCase(out, componentClass, property);
-    }
-  }
-
-  private void _writeSetPropertiesCase(
-      PrettyWriter out,
-      String componentClass,
-      PropertyBean property) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String propClass = property.getPropertyClass();
-    String propVar = "_" + propName;
-    
-    if (property.isVirtual())
-    {
-      _writeVirtualSetMethod(out, componentClass, propName);
-    }
-    else if (property.isMethodBinding())
-    {
-      _writeSetMethodBinding(out, componentClass, property);
-    }
-    else if (property.isMethodExpression())
-    {
-      _writeSetMethodExpression(out, componentClass, property);
-    }
-    else if (property.isEnum())
-    {
-      _writeSetEnum(out, componentClass, property);
-    }
-    else if (GeneratorHelper.isKeyStroke(propClass))
-    {
-      _writeSetKeyStroke(out, componentClass, propName);
-    }
-    else if (GeneratorHelper.isAWTKeyStroke(propClass))
-    {
-      _writeSetAWTKeyStroke(out, componentClass, propName);
-    }
-    else if (GeneratorHelper.isColorList(propClass, property.getPropertyClassParameters()))
-    {
-      _writeSetColor(out, componentClass, propName, true);
-    }
-    else if (GeneratorHelper.isColor(propClass))
-    {
-      _writeSetColor(out, componentClass, propName, false);
-    }
-    else if (GeneratorHelper.isConverter(propClass))
-    {
-      _writeSetConverter(out, componentClass, propName);
-    }
-    else if (property.isLiteralOnly())
-    {
-      _writeSetLiteral(out, componentClass, propName, propClass, propVar);
-    }
-    else if ("java.util.Date".equals(propClass))
-    {
-      _writeSetDate(out, componentClass, propName, propClass, propVar, property.getUseMaxTime());
-    }
-    else //if (_hasPropertySetter(property))
-    {
-      _writeSetProperty(out, componentClass, propName, propClass, propVar);
-    }
-    //    else
-    //    {
-    //      _writeSetValueBinding(out, componentClass, propName, propVar);
-    //    }
-  }
-
-  private void _writeSetLiteral(
-      PrettyWriter out,
-      String componentClass,
-      String propName,
-      String propFullClass,
-      String propVar)
-  {
-    String propClass = Util.getClassFromFullClass(propFullClass);
-    String boxedClass = Util.getBoxedClass(propClass);
-    if ((!_is12 && !boxedClass.equals(propClass)) ||
-        "java.util.Date".equals(propFullClass) ||
-        (boxedClass.indexOf("[]") != -1))
-    {
-      // TODO: reject value binding expressions for literal-only
-      _writeSetProperty(out, componentClass, propName, propFullClass, propVar);
-    }
-    else
-    {
-      String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-      out.println("bean.setProperty(" +
-          componentClass + "." + propKey + ", " +
-          propVar + ");");
-    }
-  }
-
-  private void _writeSetDate(
-    PrettyWriter out,
-    String componentClass,
-    String propName,
-    String propFullClass,
-    String propVar,
-    boolean useMaxTime)
-  {
-    String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-    String propClass = Util.getClassFromFullClass(propFullClass);
-    String boxedClass = Util.getBoxedClass(propClass);
-    String setProperty = "setProperty";
-    String propType = boxedClass.replaceAll("\\[\\]", "Array");
-    if (useMaxTime)
-    {
-      setProperty = Util.getPrefixedPropertyName("setMax", propType + "Property");
-    }
-    else
-    {
-      setProperty = Util.getPrefixedPropertyName("set", propType + "Property");
-    }
-
-    out.println(setProperty + "(bean, " +
-        componentClass + "." + propKey + ", " +
-        propVar + ");");
-  }
-
-  private void _writeSetProperty(
-      PrettyWriter out,
-      String componentClass,
-      String propName,
-      String propFullClass,
-      String propVar)
-  {
-    String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-    String propClass = Util.getClassFromFullClass(propFullClass);
-    String boxedClass = Util.getBoxedClass(propClass);
-    String setProperty = "setProperty";
-    if ((!_is12 && !boxedClass.equals(propClass)) ||
-        GeneratorHelper.isNumber(propFullClass) ||
-        "java.util.Date".equals(propFullClass) ||
-        (boxedClass.indexOf("[]") != -1))
-    {
-      String propType = boxedClass.replaceAll("\\[\\]", "Array");
-      setProperty = Util.getPrefixedPropertyName("set", propType + "Property");
-    }
-
-    out.println(setProperty + "(bean, " +
-        componentClass + "." + propKey + ", " +
-        propVar + ");");
-  }
-
-  private String[] _getAccessKeyPropertyKeys(
-      String componentClass,
-      String propName)
-  {
-    String[] propKeys = new String[2];
-
-    int offset = propName.indexOf("AndAccessKey");
-    if (offset != -1)
-    {
-      String mainProp = propName.substring(0, offset);
-      propKeys[0] = componentClass + "." +
-          Util.getConstantNameFromProperty(mainProp, "_KEY");
-      propKeys[1] = componentClass + "." +
-          Util.getConstantNameFromProperty("accessKey", "_KEY");
-    }
-
-    return propKeys;
-  }
-
-  private void _writeSetValueBinding(
-      PrettyWriter out,
-      String componentClass,
-      String propName,
-      String propVar)
-  {
-    String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-    out.println("bean.setValueBinding(" + componentClass + "." + propKey + ", " +
-        "createValueBinding(" + propVar + "));");
-  }
-
-  private void _writeVirtualSetMethod(
-      PrettyWriter out,
-      String componentClass,
-      String propName) throws IOException
-  {
-    String[] propKeys = _getAccessKeyPropertyKeys(componentClass, propName);
-
-    String propVar = "_" + propName;
-    out.println("if (" + propVar + " != null)");
-    out.println("{");
-    out.indent();
-
-    if (_is12)
-    {
-      out.println("if (!" + propVar + ".isLiteralText())");
-      out.println("{");
-      out.indent();
-      out.println("VirtualAttributeUtils.setAccessKeyAttribute(");
-      out.indent();
-      out.println("bean,");
-      out.println(propVar + ",");
-      out.println(propKeys[0] + ",");
-      out.println(propKeys[1] + ");");
-      out.unindent();
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("String s = " + propVar + ".getExpressionString();");
-      out.println("if (s != null)");
-      out.indent();
-      out.println("VirtualAttributeUtils.setAccessKeyAttribute(");
-      out.indent();
-      out.println("bean,");
-      out.println("s,");
-      out.println(propKeys[0] + ",");
-      out.println(propKeys[1] + ");");
-      out.unindent();
-      out.unindent();
-      out.unindent();
-      out.println("}");
-    }
-    else
-    {
-      out.println("if (isValueReference(" + propVar + "))");
-      out.println("{");
-      out.indent();
-      out.println("ValueBinding vb = createValueBinding(" + propVar + ");");
-      out.println("VirtualAttributeUtils.setAccessKeyAttribute(");
-      out.indent();
-      out.println("bean,");
-      out.println("vb,");
-      out.println(propKeys[0] + ",");
-      out.println(propKeys[1] + ");");
-      out.unindent();
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("VirtualAttributeUtils.setAccessKeyAttribute(");
-      out.indent();
-      out.println("bean,");
-      out.println(propVar + ",");
-      out.println(propKeys[0] + ",");
-      out.println(propKeys[1] + ");");
-      out.unindent();
-      out.unindent();
-      out.println("}");
-    }
-
-    out.unindent();
-    out.println("}");
-  }
-
-  private void _writeSetMethodBinding(
-      PrettyWriter out,
-      String componentClass,
-      PropertyBean property) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-    String propVar = "_" + propName;
-
-    if (_is12)
-    {
-      out.println("if (" + propVar + " != null)");
-      out.indent();
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ", " +
-          "new MethodExpressionMethodBinding(" + propVar + "));");
-      out.unindent();
-    }
-    else
-    {
-      MethodSignatureBean signature = property.getMethodBindingSignature();
-      String[] paramTypes = (signature != null) ? signature.getParameterTypes() : null;
-
-      String classArray;
-
-      if (paramTypes == null || paramTypes.length == 0)
-      {
-        classArray = "new Class[0]";
-      }
-      else
-      {
-        StringBuffer sb = new StringBuffer();
-        sb.append("new Class[]{");
-        for (int i = 0; i < paramTypes.length; i++)
-        {
-          if (i > 0)
-            sb.append(',');
-          sb.append(paramTypes[i]);
-          sb.append(".class");
-        }
-
-        // TODO: remove trailing comma
-        sb.append(',');
-
-        sb.append('}');
-        classArray = sb.toString();
-      }
-
-      out.println("if (" + propVar + " != null)");
-      out.println("{");
-      out.indent();
-
-      if (isStringMethodBindingReturnType(signature))
-      {
-        out.println("MethodBinding mb;");
-        out.println("if (isValueReference(" + propVar + "))");
-        out.indent();
-        out.println("mb = createMethodBinding(" + propVar + ", " + classArray + ");");
-        out.unindent();
-        out.println("else");
-        out.indent();
-        out.println("mb = new org.apache.myfaces.trinidadinternal.taglib.ConstantMethodBinding(" + propVar + ");");
-        out.unindent();
-      }
-      else
-      {
-        // never a literal, no need for ConstantMethodBinding
-        out.println("MethodBinding mb = createMethodBinding(" + propVar + ", " +
-            classArray + ");");
-      }
-
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ", mb);");
-      out.unindent();
-      out.println("}");
-    }
-  }
-
-  private void _writeSetMethodExpression(
-      PrettyWriter out,
-      String componentClass,
-      PropertyBean property) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-    String propVar = "_" + propName;
-
-    out.println("bean.setProperty(" + componentClass + "." + propKey + ", " +
-        propVar + ");");
-  }
-
-  private void _writeSetEnum(
-      PrettyWriter out,
-      String componentClass,
-      PropertyBean property) throws IOException
-  {
-    String propName = property.getPropertyName();
-    String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-    String propVar = "_" + propName;
-    String propClass = Util.getClassFromFullClass(property.getPropertyClass());
-
-    if (_is12)
-    {
-      out.println("if (" + propVar + " != null)");
-      out.println("{");
-      out.indent();
-      out.println("if (!" + propVar + ".isLiteralText())");
-      out.println("{");
-      out.indent();
-      out.println("bean.setValueExpression(" + componentClass + "." + propKey + ", " + propVar + ");");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("String s = " + propVar + ".getExpressionString();");
-      out.println("if (s != null)");
-      out.indent();
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
-      out.println("Enum.valueOf(" + propClass + ".class,s));");
-      out.unindent();
-      out.unindent();
-      out.println("}");
-      out.unindent();
-      out.println("}");
-    }
-    else
-    {
-      out.println("if (" + propVar + " != null)");
-      out.println("{");
-      out.indent();
-      out.println("if (isValueReference(" + propVar + "))");
-      out.println("{");
-      out.indent();
-      out.println("ValueBinding vb = createValueBinding(" + propVar + ");");
-      out.println("bean.setValueBinding(" + componentClass + "." + propKey + ", vb);");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
-      out.println("Enum.valueOf(" + propClass + ".class," + propVar + "));");
-      out.unindent();
-      out.println("}");
-      out.unindent();
-      out.println("}");
-    }
-  }
-
-
-  private void _writeSetKeyStroke(
-      PrettyWriter out,
-      String componentClass,
-      String propName) throws IOException
-  {
-    String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-    String propVar = "_" + propName;
-
-
-    if (_is12)
-    {
-      out.println("if (" + propVar + " != null)");
-      out.println("{");
-      out.indent();
-      out.println("if (!" + propVar + ".isLiteralText())");
-      out.println("{");
-      out.indent();
-      out.println("bean.setValueExpression(" + componentClass + "." + propKey + ", " + propVar + ");");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("String val = " + propVar + ".getExpressionString();");
-      out.println("if (val != null)");
-      out.indent();
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
-      out.println("\tKeyStroke.getKeyStroke(val));");
-      out.unindent();
-      out.unindent();
-      out.println("}");
-      out.unindent();
-      out.println("}");
-    }
-    else
-    {
-      out.println("if (" + propVar + " != null)");
-      out.println("{");
-      out.indent();
-      out.println("if (isValueReference(" + propVar + "))");
-      out.println("{");
-      out.indent();
-      out.println("ValueBinding vb = createValueBinding(" + propVar + ");");
-      out.println("bean.setValueBinding(" + componentClass + "." + propKey + ", vb);");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
-      out.println("\tKeyStroke.getKeyStroke(" + propVar + "));");
-      out.unindent();
-      out.println("}");
-      out.unindent();
-      out.println("}");
-    }
-  }
-
-
-  private void _writeSetAWTKeyStroke(
-      PrettyWriter out,
-      String componentClass,
-      String propName) throws IOException
-  {
-    String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-    String propVar = "_" + propName;
-
-    if (_is12)
-    {
-      out.println("if (" + propVar + " != null)");
-      out.println("{");
-      out.indent();
-      out.println("if (!" + propVar + ".isLiteralText())");
-      out.println("{");
-      out.indent();
-      out.println("bean.setValueExpression(" + componentClass + "." + propKey + ", " + propVar + ");");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("String val = " + propVar + ".getExpressionString();");
-      out.println("if (val != null)");
-      out.indent();
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
-      out.println("\tAWTKeyStroke.getAWTKeyStroke(val));");
-      out.unindent();
-      out.unindent();
-      out.println("}");
-      out.unindent();
-      out.println("}");
-    }
-    else
-    {
-      out.println("if (" + propVar + " != null)");
-      out.println("{");
-      out.indent();
-      out.println("if (isValueReference(" + propVar + "))");
-      out.println("{");
-      out.indent();
-      out.println("ValueBinding vb = createValueBinding(" + propVar + ");");
-      out.println("bean.setValueBinding(" + componentClass + "." + propKey + ", vb);");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
-      out.println("\tAWTKeyStroke.getAWTKeyStroke(" + propVar + "));");
-      out.unindent();
-      out.println("}");
-      out.unindent();
-      out.println("}");
-    }
-  }
-
-
-  private void _writeSetColor(
-      PrettyWriter out,
-      String  componentClass,
-      String  propName,
-      boolean isList) throws IOException
-  {
-    String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-    String propVar = "_" + propName;
-
-    out.println("if (" + propVar + " != null)");
-    out.println("{");
-    out.indent();
-    if (_is12)
-    {
-      out.println("if (!" + propVar + ".isLiteralText())");
-      out.println("{");
-      out.indent();
-      out.println("bean.setValueExpression(" + componentClass + "." + propKey + ", " + propVar + ");");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("String s = " + propVar + ".getExpressionString();");
-      out.println("if (s != null)");
-      out.indent();
-      out.println("{");
-      out.println("try");
-      out.println("{");
-      out.indent();
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
-      if (isList)
-        out.println("                 TagUtils.getColorList(s));");
-      else
-      {
-        out.println("                 TagUtils.getColor(s));");
-      }
-      out.unindent();
-      out.println("}");
-      out.println("catch (ParseException pe)");
-      out.println("{");
-      out.indent();
-      out.println("setValidationError(");
-      out.println("  pe.getMessage() + \": \" + \"Position \" + pe.getErrorOffset());");
-      out.unindent();
-      out.println("}");
-      out.unindent();
-      out.println("}");
-      out.unindent();
-      out.println("}");
-    }
-    else
-    {
-      out.println("if (isValueReference(" + propVar + "))");
-      out.println("{");
-      out.indent();
-      out.println("ValueBinding vb = createValueBinding(" + propVar + ");");
-      out.println("bean.setValueBinding(" + componentClass + "." + propKey + ", vb);");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("try");
-      out.println("{");
-      out.indent();
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ",");
-      if (isList)
-        out.println("                 TagUtils.getColorList(" + propVar + "));");
-      else
-        out.println("                 TagUtils.getColor(" + propVar + "));");
-      out.unindent();
-      out.println("}");
-      out.println("catch (ParseException pe)");
-      out.println("{");
-      out.indent();
-      out.println("setValidationError(");
-      out.println("  pe.getMessage() + \": \" + \"Position \" + pe.getErrorOffset());");
-      out.unindent();
-      out.println("}");
-      out.unindent();
-      out.println("}");
-    }
-    out.unindent();
-    out.println("}");
-  }
-
-
-  private void _writeSetConverter(
-      PrettyWriter out,
-      String componentClass,
-      String propName) throws IOException
-  {
-    String propKey = Util.getConstantNameFromProperty(propName, "_KEY");
-    String propVar = "_" + propName;
-
-    out.println("if (" + propVar + " != null)");
-    out.println("{");
-    out.indent();
-    if (_is12)
-    {
-      out.println("if (!" + propVar + ".isLiteralText())");
-      out.println("{");
-      out.indent();
-      out.println("bean.setValueExpression(" + componentClass + "." + propKey + ", " + propVar + ");");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("String s = " + propVar + ".getExpressionString();");
-      out.println("if (s != null)");
-      out.println("{");
-
-      out.indent();
-      out.println("Converter converter = getFacesContext().getApplication().");
-      out.indent();
-      out.println("createConverter(s);");
-      out.unindent();
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ", converter);");
-
-      out.unindent();
-      out.println("}");
-
-      out.unindent();
-      out.println("}");
-    }
-    else
-    {
-      out.println("if (isValueReference(" + propVar + "))");
-      out.println("{");
-      out.indent();
-      out.println("ValueBinding vb = createValueBinding(" + propVar + ");");
-      out.println("bean.setValueBinding(" + componentClass + "." + propKey + ", vb);");
-      out.unindent();
-      out.println("}");
-      out.println("else");
-      out.println("{");
-      out.indent();
-      out.println("Converter converter = getFacesContext().getApplication().");
-      out.indent();
-      out.println("createConverter(" + propVar + ");");
-      out.unindent();
-      out.println("bean.setProperty(" + componentClass + "." + propKey + ", converter);");
-      out.unindent();
-      out.println("}");
-    }
-    out.unindent();
-    out.println("}");
-  }
-
-  private boolean isStringMethodBindingReturnType(
-      MethodSignatureBean sig)
-  {
-    return (sig != null && "java.lang.String".equals(sig.getReturnType()));
-  }
-
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/TrinidadConverterTagGenerator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/TrinidadConverterTagGenerator.java
deleted file mode 100644
index 1407e9a..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/TrinidadConverterTagGenerator.java
+++ /dev/null
@@ -1,167 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib;
-
-import org.apache.maven.plugin.logging.Log;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ConverterBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-
-import java.util.Set;
-import java.util.TreeSet;
-
-public class TrinidadConverterTagGenerator extends AbstractConverterTagGenerator {
-
-  public TrinidadConverterTagGenerator(boolean is12, String licenseHeader, Log log) {
-    super(is12, licenseHeader, log);
-  }
-
-  protected Set createImports(ConverterBean converter) {
-    Set imports = new TreeSet();
-
-    if (is12())
-    {
-      imports.add("javax.faces.webapp.ConverterELTag");
-      imports.add("javax.faces.context.FacesContext");
-      imports.add("javax.faces.application.Application");
-    }
-    else
-    {
-      imports.add("javax.faces.webapp.ConverterTag");
-    }
-
-    imports.add("javax.servlet.jsp.JspException");
-    imports.add(converter.getConverterClass());
-
-    imports.add("javax.faces.convert.Converter");
-    if (is12())
-    {
-      imports.add("javax.el.ValueExpression");
-    }
-    else
-    {
-      imports.add("javax.faces.el.ValueBinding");
-    }
-    imports.add("org.apache.myfaces.trinidadinternal.taglib.util.TagUtils");
-
-
-    addImportsFromPropertes(converter, imports);
-    return imports;
-  }
-
-
-
-
-  protected void writeSetProperty(
-    PrettyWriter out,
-    PropertyBean property)
-  {
-    String propName = property.getPropertyName();
-    String propFullClass = property.getPropertyClass();
-    String propClass = Util.getClassFromFullClass(propFullClass);
-    String propVar = "_" + Util.getVariableFromName(propName);
-
-    out.println("if (" + propVar + " != null)");
-    out.println("{");
-    out.indent();
-
-    if (is12())
-    {
-      out.println("if (!" + propVar + ".isLiteralText())");
-      out.println("{");
-      out.indent();
-      out.println("converter.setValueExpression(\"" + propName + "\", " +
-                  propVar + ");");
-      out.unindent();
-      out.println("}");
-      String propType = resolveType(propFullClass);
-      if (propType != null)
-      {
-        out.println("else");
-        out.println("{");
-        out.indent();
-        if ("StringArray".equals(propType))
-        {
-          out.println("try");
-          out.println("{");
-        }
-
-        out.println(propClass + " value = TagUtils.get" + propType + "(" + propVar + ".getValue(null));");
-        String setMethod = Util.getPrefixedPropertyName("set", propName);
-        out.println("converter." + setMethod + "(value);");
-        if ("StringArray".equals(propType))
-        {
-          out.println("}");
-          out.println("catch (ParseException pe)");
-          out.println("{");
-          out.indent();
-          out.println("throw new JspException(");
-          out.println("  pe.getMessage() + \": \" + \"Position \" + pe.getErrorOffset());");
-          out.unindent();
-          out.println("}");
-        }
-        out.unindent();
-        out.println("}");
-      }
-    }
-    else
-    {
-      out.println("if (TagUtils.isValueReference(" + propVar + "))");
-      out.println("{");
-      out.indent();
-      out.println("ValueBinding vb = TagUtils.getValueBinding(" + propVar + ");");
-      out.println("converter.setValueBinding(\"" + propName + "\", vb);");
-      out.unindent();
-      out.println("}");
-      String propType = resolveType(propFullClass);
-      if (propType != null)
-      {
-        out.println("else");
-        out.println("{");
-        out.indent();
-        if ("StringArray".equals(propType))
-        {
-          out.println("try");
-          out.println("{");
-        }
-        out.println(propClass + " value = TagUtils.get" + propType + "(" + propVar + ");");
-        String setMethod = Util.getPrefixedPropertyName("set", propName);
-        out.println("converter." + setMethod + "(value);");
-        if ("StringArray".equals(propType))
-        {
-          out.println("}");
-          out.println("catch (ParseException pe)");
-          out.println("{");
-          out.indent();
-          out.println("throw new JspException(");
-          out.println("  pe.getMessage() + \": \" + \"Position \" + pe.getErrorOffset());");
-          out.unindent();
-          out.println("}");
-        }
-        out.unindent();
-        out.println("}");
-      }
-    }
-
-    out.unindent();
-    out.println("}");
-  }
-
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/TrinidadValidatorTagGenerator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/TrinidadValidatorTagGenerator.java
deleted file mode 100644
index 6d8b7be..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/generator/taglib/TrinidadValidatorTagGenerator.java
+++ /dev/null
@@ -1,177 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.generator.taglib;
-
-import org.apache.maven.plugin.logging.Log;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.io.PrettyWriter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ValidatorBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-
-import java.util.Set;
-import java.util.TreeSet;
-
-public class TrinidadValidatorTagGenerator extends AbstractValidatorTagGenerator {
-
-  public TrinidadValidatorTagGenerator(boolean _is12, String _licenseHeader, Log _log) {
-    super(_is12, _licenseHeader, _log);
-  }
-
-  protected Set createImports(ValidatorBean validator) {
-    Set imports = new TreeSet();
-
-    if (is12())
-    {
-      imports.add("javax.faces.webapp.ValidatorELTag");
-      imports.add("javax.faces.context.FacesContext");
-      imports.add("javax.faces.application.Application");
-    }
-    else
-    {
-      imports.add("javax.faces.webapp.ValidatorTag");
-    }
-    imports.add("javax.servlet.jsp.JspException");
-    imports.add(validator.getValidatorClass());
-
-    imports.add("javax.faces.validator.Validator");
-
-    if (is12())
-    {
-      imports.add("javax.el.ValueExpression");
-    }
-    else
-    {
-      imports.add("javax.faces.el.ValueBinding");
-    }
-    imports.add("org.apache.myfaces.trinidadinternal.taglib.util.TagUtils");
-
-
-    addImportsFromPropertes(validator, imports);
-    return imports;
-  }
-
-  protected void writeSetProperty(
-    PrettyWriter out,
-    PropertyBean property)
-  {
-    String propName = property.getPropertyName();
-    String propFullClass = property.getPropertyClass();
-    String propClass = Util.getClassFromFullClass(propFullClass);
-    String propVar = "_" + Util.getVariableFromName(propName);
-    out.println("if (" + propVar + " != null)");
-    out.println("{");
-    out.indent();
-    if (is12())
-    {
-      out.println("if (!" + propVar + ".isLiteralText())");
-      out.println("{");
-      out.indent();
-      out.println("validator.setValueExpression(\"" + propName + "\", " +
-                  propVar + ");");
-      out.unindent();
-      out.println("}");
-      String propType = null;
-      if ("Date".equals (propClass)) 
-      {
-        propType = resolveDateType(propFullClass, property.getUseMaxTime());                        
-      }
-      else 
-      {
-        propType = resolveType(propFullClass);            
-      }
-      if (propType != null)
-      {
-        out.println("else");
-        out.println("{");
-        out.indent();
-        if ("StringArray".equals(propType))
-        {
-          out.println("try");
-          out.println("{");
-        }
-
-        out.println(propClass + " value = TagUtils.get" + propType + "(" + propVar + ".getValue(null));");
-        String setMethod = Util.getPrefixedPropertyName("set", propName);
-        out.println("validator." + setMethod + "(value);");
-        if ("StringArray".equals(propType))
-        {
-          out.println("}");
-          out.println("catch (ParseException pe)");
-          out.println("{");
-          out.indent();
-          out.println("throw new JspException(");
-          out.println("  pe.getMessage() + \": \" + \"Position \" + pe.getErrorOffset());");
-          out.unindent();
-          out.println("}");
-        }
-        out.unindent();
-        out.println("}");
-      }
-    }
-    else
-    {
-      out.println("if (TagUtils.isValueReference(" + propVar + "))");
-      out.println("{");
-      out.indent();
-      out.println("ValueBinding vb = TagUtils.getValueBinding(" + propVar + ");");
-      out.println("validator.setValueBinding(\"" + propName + "\", vb);");
-      out.unindent();
-      out.println("}");
-      String propType = null;
-      if ("Date".equals (propClass)) 
-      {
-        propType = resolveDateType(propFullClass, property.getUseMaxTime());                        
-      }
-      else 
-      {
-        propType = resolveType(propFullClass);            
-      }
-      if (propType != null)
-      {
-        out.println("else");
-        out.println("{");
-        out.indent();
-        if ("StringArray".equals(propType))
-        {
-          out.println("try");
-          out.println("{");
-        }
-        out.println(propClass + " value = TagUtils.get" + propType + "(" + propVar + ");");
-        String setMethod = Util.getPrefixedPropertyName("set", propName);
-        out.println("validator." + setMethod + "(value);");
-        if ("StringArray".equals(propType))
-        {
-          out.println("}");
-          out.println("catch (ParseException pe)");
-          out.println("{");
-          out.indent();
-          out.println("throw new JspException(");
-          out.println("  pe.getMessage() + \": \" + \"Position \" + pe.getErrorOffset());");
-          out.unindent();
-          out.println("}");
-        }
-        out.unindent();
-        out.println("}");
-      }
-    }
-
-    out.unindent();
-    out.println("}");
-  }
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/io/PrettyWriter.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/io/PrettyWriter.java
deleted file mode 100644
index a5df63c..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/io/PrettyWriter.java
+++ /dev/null
@@ -1,201 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.io;
-
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.Writer;
-
-public class PrettyWriter extends PrintWriter
-{
-  public PrettyWriter(
-    OutputStream out)
-  {
-    super(out);
-  }
-
-  public PrettyWriter(
-    OutputStream out,
-    boolean      autoFlush)
-  {
-    super(out, autoFlush);
-  }
-
-  public PrettyWriter(
-    Writer out)
-  {
-    super(out);
-  }
-
-  public PrettyWriter(
-    Writer  out,
-    boolean autoFlush)
-  {
-    super(out, autoFlush);
-  }
-
-  public void indent()
-  {
-    _indentation ++;
-  }
-
-  public void unindent()
-  {
-    _indentation --;
-  }
-
-  public void write(
-    String string,
-    int    offset,
-    int    length)
-  {
-    if (_unlatchPending())
-    {
-      for (int i=0; i < _indentation; i++)
-      {
-        super.write(_TAB_INDENT, 0, 2);
-      }
-    }
-
-    super.write(string, offset, length);
-  }
-
-  public void write(
-    char[] chars,
-    int    offset,
-    int    length)
-  {
-    if (_unlatchPending())
-    {
-      for (int i=0; i < _indentation; i++)
-      {
-        super.write(_TAB_INDENT_CHARS, 0, 2);
-      }
-    }
-
-    super.write(chars, offset, length);
-  }
-
-  public void println()
-  {
-    super.println();
-    _latchPending();
-  }
-
-  public void println(
-    boolean x)
-  {
-    super.println(x);
-    _latchPending();
-  }
-
-  public void println(
-    char x)
-  {
-    super.println(x);
-    _latchPending();
-  }
-
-  public void println(
-    int x)
-  {
-    super.println(x);
-    _latchPending();
-  }
-
-  public void println(
-    long x)
-  {
-    super.println(x);
-    _latchPending();
-  }
-
-  public void println(
-    float x)
-  {
-    super.println(x);
-    _latchPending();
-  }
-
-  public void println(
-    double x)
-  {
-    super.println(x);
-    _latchPending();
-  }
-
-  public void println(
-    char[] x)
-  {
-    super.println(x);
-    _latchPending();
-  }
-
-  public void println(
-    String x)
-  {
-    int fromIndex = 0;
-    for (int index = x.indexOf('\n');
-         index != -1  && index + 1 < x.length();
-         fromIndex = index + 1,
-         index = x.indexOf('\n', fromIndex))
-    {
-      super.println(x.substring(fromIndex, index));
-      _latchPending();
-    }
-
-    super.println(x.substring(fromIndex));
-    _latchPending();
-  }
-
-  public void println(
-    Object x)
-  {
-    super.println(x);
-    _latchPending();
-  }
-
-  private boolean _unlatchPending()
-  {
-    boolean pending = _pending;
-    if (pending)
-    {
-      _pending = false;
-    }
-
-    return pending;
-  }
-
-  private boolean _latchPending()
-  {
-    boolean pending = _pending;
-    if (!pending)
-    {
-      _pending = true;
-    }
-
-    return !pending;
-  }
-
-  private int _indentation;
-  private boolean _pending = true;
-
-  private static final String _TAB_INDENT = "  ";
-  private static final char[] _TAB_INDENT_CHARS = _TAB_INDENT.toCharArray();
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/AbstractTagBean.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/AbstractTagBean.java
deleted file mode 100644
index 54c6fd5..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/AbstractTagBean.java
+++ /dev/null
@@ -1,229 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse;
-
-import javax.xml.namespace.QName;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.LinkedHashMap;
-import java.lang.reflect.Modifier;
-
-public class AbstractTagBean extends ObjectBean {
-  private String  _description;
-  private String  _longDescription;
-  private QName   _tagName;
-  private String  _tagClass;
-  protected Map _properties;
-  private int     _tagClassModifiers;
-
-  public AbstractTagBean() {
-    _properties = new LinkedHashMap();
-  }
-
-  /**
-   * Sets the description of this property.
-   *
-   * @param description  the property description
-   */
-  public void setDescription(
-    String description)
-  {
-    _description = description;
-  }
-
-  /**
-   * Returns the description of this property.
-   *
-   * @return  the property description
-   */
-  public String getDescription()
-  {
-    return _description;
-  }
-
-  /**
-   * Sets the long description of this property.
-   *
-   * @param longDescription  the long property description
-   */
-  public void setLongDescription(
-    String longDescription)
-  {
-    _longDescription = longDescription;
-  }
-
-  /**
-   * Returns the long description of this property.
-   *
-   * @return  the long property description
-   */
-  public String getLongDescription()
-  {
-    return _longDescription;
-  }
-
-  /**
-   * Sets the JSP tag handler class for this component.
-   *
-   * @param tagClass  the JSP tag handler class
-   */
-  public void setTagClass(
-    String tagClass)
-  {
-    _tagClass = tagClass;
-  }
-
-  /**
-   * Returns the JSP tag handler class for this component.
-   *
-   * @return  the JSP tag handler class
-   */
-  public String getTagClass()
-  {
-    return _tagClass;
-  }
-
-  /**
-   * Sets the JSP tag name for this component.
-   *
-   * @param tagName  the JSP tag name
-   */
-  public void setTagName(
-      QName tagName)
-  {
-    _tagName = tagName;
-  }
-
-
-  /**
-   * Returns the JSP tag name for this component.
-   *
-   * @return  the JSP tag name
-   */
-  public QName getTagName()
-  {
-    return _tagName;
-  }
-
-  /**
-   * Adds a property to this component.
-   *
-   * @param property  the property to add
-   */
-  public void addProperty(
-    PropertyBean property)
-  {
-    _properties.put(property.getPropertyName(), property);
-  }
-
-  /**
-   * Returns the property for this property name.
-   *
-   * @param propertyName  the property name to find
-   */
-  public PropertyBean findProperty(
-    String propertyName)
-  {
-    return (PropertyBean)_properties.get(propertyName);
-  }
-
-  /**
-   * Returns true if this component has any properties.
-   *
-   * @return  true   if this component has any properties,
-   *          false  otherwise
-   */
-  public boolean hasProperties()
-  {
-    return !_properties.isEmpty();
-  }
-
-  /**
-   * Returns an iterator for all properties on this component only.
-   *
-   * @return  the property iterator
-   */
-  public Iterator properties()
-  {
-    return _properties.values().iterator();
-  }
-
-  public void parseTagClassModifier(
-    String modifier)
-  {
-    addTagClassModifier(_parseModifier(modifier));
-  }
-
-  protected int _parseModifier(
-    String text)
-  {
-    if ("public".equals(text))
-      return Modifier.PUBLIC;
-    else if ("protected".equals(text))
-      return Modifier.PROTECTED;
-    else if ("private".equals(text))
-      return Modifier.PRIVATE;
-    else if ("abstract".equals(text))
-      return Modifier.ABSTRACT;
-    else if ("final".equals(text))
-      return Modifier.FINAL;
-
-    throw new IllegalArgumentException("Unrecognized modifier: " + text);
-  }
-
-  /**
-   * Adds a Java Language class modifier to the tag class.
-   *
-   * @param modifier  the modifier to be added
-   */
-  public void addTagClassModifier(
-    int modifier)
-  {
-    _tagClassModifiers |= modifier;
-  }
-
-  /**
-   * Returns the Java Language class modifiers for the tag class.
-   * By default, these modifiers include Modifier.PUBLIC.
-   *
-   * @return  the Java Language class modifiers for the tag class
-   */
-  public int getTagClassModifiers()
-  {
-    int modifiers = _tagClassModifiers;
-
-    if (!Modifier.isPrivate(modifiers) &&
-        !Modifier.isProtected(modifiers) &&
-        !Modifier.isPublic(modifiers))
-    {
-      modifiers |= Modifier.PUBLIC;
-    }
-
-    return modifiers;
-  }
-
- /**
-  * Number of properties for this component
-  * @return num of properties
-  */
-  public int propertiesSize()
-  {
-    return _properties.size();
-  }
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/AttributeBean.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/AttributeBean.java
deleted file mode 100644
index 74b3855..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/AttributeBean.java
+++ /dev/null
@@ -1,225 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.lang.Comparable;
-
-/**
- * AttributeBean is a Java representation of the faces-config component or
- * renderer attribute XML element.
- */
-public class AttributeBean extends ObjectBean implements Comparable
-{
-  /**
-   * Sets the name of this attribute.
-   *
-   * @param attributeName  the attribute name
-   */
-  public void setAttributeName(
-    String attributeName)
-  {
-    _attributeName = attributeName;
-  }
-
-  /**
-   * Returns the name of this attribute.
-   *
-   * @return  the attribute name
-   */
-  public String getAttributeName()
-  {
-    return _attributeName;
-  }
-
-  /**
-   * Sets the attribute class for this attribute.
-   *
-   * @param attributeClass  the attribute class
-   */
-  public void setAttributeClass(
-    String attributeClass)
-  {
-    Matcher matcher = _GENERIC_TYPE.matcher(attributeClass);
-
-    if (matcher.matches())
-    {
-      _attributeClass = matcher.group(1);
-      _attributeClassParameters = matcher.group(2).split(",");
-    }
-    else
-    {
-      _attributeClass = attributeClass;
-      _attributeClassParameters = _EMPTY_ARRAY;
-    }
-  }
-
-  /**
-   * Returns the array of parameterized types for this attribute
-   * if it uses generics.
-   *
-   * @return the array of parameterized types for this attribute
-   */
-  public String[] getAttributeClassParameters()
-  {
-    return _attributeClassParameters;
-  }
-
-  /**
-   * Returns the attribute class for this attribute.
-   *
-   * @return  the attribute class
-   */
-  public String getAttributeClass()
-  {
-    return _attributeClass;
-  }
-
-  /**
-   * Sets the description of this attribute.
-   *
-   * @param description  the attribute description
-   */
-  public void setDescription(
-    String description)
-  {
-    _description = description;
-  }
-
-  /**
-   * Returns the description of this attribute.
-   *
-   * @return  the attribute description
-   */
-  public String getDescription()
-  {
-    return _description;
-  }
-
-  /**
-   * Sets the default value of this attribute.
-   *
-   * @param defaultValue  the attribute default value
-   */
-  public void setDefaultValue(
-    String defaultValue)
-  {
-    _defaultValue = defaultValue;
-  }
-
-  /**
-   * Returns the default value of this attribute.
-   *
-   * @return  the attribute default value
-   */
-  public String getDefaultValue()
-  {
-    return _defaultValue;
-  }
-
-  /**
-   * Sets the alternative class for this property.
-   *
-   * @param alternateClass  the alternative class
-   */
-  public void setAlternateClass(
-    String alternateClass)
-  {
-    _alternateClass = alternateClass;
-  }
-
-  /**
-   * Returns the alternative class for this property.
-   *
-   * @return  the alternative class
-   */
-  public String getAlternateClass()
-  {
-    return _alternateClass;
-  }
-
-  /**
-   * Sets the method binding signature of this property.
-   *
-   * @param signature  the method binding signature of this property
-   */
-  public void setMethodBindingSignature(
-    MethodSignatureBean signature)
-  {
-    _signature = signature;
-  }
-
-  /**
-   * Returns the method binding signature of this property.
-   *
-   * @return the method binding signature of this property
-   */
-  public MethodSignatureBean getMethodBindingSignature()
-  {
-    return _signature;
-  }
-
-  /**
-   * Sets the virtual flag of this property.
-   *
-   * @param virtual  the property required flag
-   */
-  public void setVirtual(
-    boolean virtual)
-  {
-    _virtual = virtual;
-  }
-
-  /**
-   * Returns virtual flag of this property.
-   *
-   * @return  the property virtual flag
-   */
-  public boolean isVirtual()
-  {
-    return _virtual;
-  }
-
-  public int compareTo(Object o)
-  {
-    if(o instanceof AttributeBean)
-    {
-      AttributeBean attr = (AttributeBean)o;
-      return _attributeName.compareTo(attr._attributeName);
-    }
-    else
-    {
-      return 1;
-    }
-  }
-
-  private String   _attributeName;
-  private String   _attributeClass;
-  private String[] _attributeClassParameters;
-  private String   _description;
-  private String   _defaultValue;
-  // FIXME: Alternate type does not seem to support generic types
-  private String   _alternateClass;
-  private boolean  _virtual;
-  private MethodSignatureBean _signature;
-
-  static private final Pattern _GENERIC_TYPE = Pattern.compile("([^<]+)<(.+)>");
-  static private final String[] _EMPTY_ARRAY = new String[0];
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/ComponentBean.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/ComponentBean.java
deleted file mode 100644
index 2a6e1e9..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/ComponentBean.java
+++ /dev/null
@@ -1,1128 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.CompoundIterator;
-
-import javax.xml.namespace.QName;
-import java.lang.reflect.Modifier;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.logging.Logger;
-
-/**
- * ComponentBean is a Java representation of the faces-config component
- * XML element.
- */
-public class ComponentBean extends ObjectBean
-{
-  /**
-   * Creates a new ComponentBean.
-   */
-  public ComponentBean()
-  {
-    _properties = new LinkedHashMap();
-    _facets = new LinkedHashMap();
-    _events = new LinkedHashMap();
-  }
-
-  /**
-   * Sets the UIX2 local name for this component.
-   *
-   * @param localName  the local name
-   *
-   * @deprecated remove when "ui" package is gone
-   */
-  public void setLocalName(
-    String localName)
-  {
-    _localName = localName;
-  }
-
-  /**
-   * Returns the UIX2 local name for this component.
-   *
-   * @return  the local name
-   */
-  public String getLocalName()
-  {
-    return _localName;
-  }
-
-  /**
-   * Sets the UIX2 node class for this component.
-   *
-   * @param nodeClass  the node class
-   *
-   * @deprecated remove when "ui" package is gone
-   */
-  public void setNodeClass(
-    String nodeClass)
-  {
-    _nodeClass = nodeClass;
-  }
-
-  /**
-   * Returns the UIX2 node class for this component.
-   *
-   * @return  the node class
-   */
-  public String getNodeClass()
-  {
-    return _nodeClass;
-  }
-
-  /**
-   * Sets the component type for this component.
-   *
-   * @param componentType  the component type
-   */
-  public void setComponentType(
-    String componentType)
-  {
-    _componentType = componentType;
-  }
-
-  /**
-   * Returns the component type for this component.
-   *
-   * @return  the component type
-   */
-  public String getComponentType()
-  {
-    return _componentType;
-  }
-
-  /**
-   * Sets the component family for this component.
-   *
-   * @param componentFamily  the component family
-   */
-  public void setComponentFamily(
-    String componentFamily)
-  {
-    _componentFamily = componentFamily;
-  }
-
-  /**
-   * Returns the component family for this component.
-   *
-   * @return  the component family
-   */
-  public String getComponentFamily()
-  {
-    return _componentFamily;
-  }
-
-  /**
-   * Returns true if the component family exists for this component.
-   *
-   * @return  true  if the component family exists,
-   *          false otherwise
-   */
-  public boolean hasComponentFamily()
-  {
-    return (_componentFamily != null);
-  }
-
-  /**
-   * Sets the component class for this component.
-   *
-   * @param componentClass  the component class
-   */
-  public void setComponentClass(
-    String componentClass)
-  {
-    _componentClass = componentClass;
-  }
-
-  /**
-   * Returns the component class for this component.
-   *
-   * @return  the component class
-   */
-  public String getComponentClass()
-  {
-    return _componentClass;
-  }
-
-  /**
-   * Sets the description of this property.
-   *
-   * @param description  the property description
-   */
-  public void setDescription(
-    String description)
-  {
-    _description = description;
-  }
-
-  /**
-   * Returns the description of this property.
-   *
-   * @return  the property description
-   */
-  public String getDescription()
-  {
-    return _description;
-  }
-
-  /**
-   * Sets the long description of this property.
-   *
-   * @param longDescription  the long property description
-   */
-  public void setLongDescription(
-    String longDescription)
-  {
-    _longDescription = longDescription;
-  }
-
-  /**
-   * Returns the long description of this property.
-   *
-   * @return  the long property description
-   */
-  public String getLongDescription()
-  {
-    return _longDescription;
-  }
-
-  /**
-   * Sets the JSP tag handler class for this component.
-   *
-   * @param tagClass  the JSP tag handler class
-   */
-  public void setTagClass(
-    String tagClass)
-  {
-    _tagClass = tagClass;
-  }
-
-  /**
-   * Sets the unsupported agents for this component.
-   *
-   * @param unsupportedAgents  the unsupported agents
-   */
-  public void setUnsupportedAgents(
-    String[] unsupportedAgents)
-  {
-    if (unsupportedAgents == null)
-      throw new NullPointerException("unsupportedAgents");
-
-    _unsupportedAgents = unsupportedAgents;
-  }
-
-  /**
-   * Returns unsupported agents for this component.
-   *
-   * @return  the unsupported agents
-   */
-  public String[] getUnsupportedAgents()
-  {
-    return _unsupportedAgents;
-  }
-
-
-  /**
-   * Returns the JSP tag handler class for this component.
-   *
-   * @return  the JSP tag handler class
-   */
-  public String getTagClass()
-  {
-    return _tagClass;
-  }
-
-   /**
-   * Sets the JSP tag handler superclass for this component.
-   *
-   * @param tagSuperclass  the JSP tag handler superclass
-   */
-  public void setTagSuperclass(
-    String tagSuperclass)
-  {
-    _tagSuperclass = tagSuperclass;
-  }
-
-  /**
-   * Returns the JSP tag handler superclass for this component.
-   *
-   * @return  the JSP tag handler superclass
-   */
-  public String getTagSuperclass()
-  {
-    return _tagSuperclass;
-  }
-
-  /**
-  * Sets the Facelets tag handler (component handler) this component.
-  *
-  * @param tagHandler the Facelets tag handler class
-  */
- public void setTagHandler(
-   String tagHandler)
- {
-   _tagHandler = tagHandler;
- }
-
- /**
-  * Returns the Facelets tag handler for this component
-  *
-  * @return  the Facelets tag handler
-  */
- public String getTagHandler()
- {
-   return _tagHandler;
- }
-
-  /**
-   * Returns the JSP tag name for this component.
-   *
-   * @return  the JSP tag name
-   */
-  public QName getTagName()
-  {
-    return _tagName;
-  }
-
-  /**
-   * Sets the JSP tag name for this component.
-   *
-   * @param tagName  the JSP tag name
-   */
-  public void setTagName(
-    QName tagName)
-  {
-    _tagName = tagName;
-  }
-
-  /**
-   * Sets the namingContainer flag of this property.
-   *
-   * @param namingContainer  the component namingContainer flag
-   */
-  public void setNamingContainer(
-    boolean namingContainer)
-  {
-    _namingContainer = namingContainer;
-  }
-
-  /**
-   * Returns namingContainer flag of this component.
-   *
-   * @return  the component namingContainer flag
-   */
-  public boolean isNamingContainer()
-  {
-    return _namingContainer;
-  }
-
-  /**
-   * Sets the component supertype for this component.
-   *
-   * @param componentSupertype  the component super type
-   */
-  public void setComponentSupertype(
-    String componentSupertype)
-  {
-    _componentSupertype = componentSupertype;
-  }
-
-  /**
-   * Returns the component supertype for this component.
-   *
-   * @return  the component supertype
-   */
-  public String getComponentSupertype()
-  {
-    return _componentSupertype;
-  }
-
-  /**
-   * Sets the component super class for this component.
-   *
-   * @param componentSuperclass  the component super class
-   */
-  public void setComponentSuperclass(
-    String componentSuperclass)
-  {
-    _componentSuperclass = componentSuperclass;
-  }
-
-  /**
-   * Returns the component super class for this component.
-   *
-   * @return  the component super class
-   */
-  public String getComponentSuperclass()
-  {
-    return _componentSuperclass;
-  }
-
-  /**
-   * Sets the renderer type for this component.
-   *
-   * @param rendererType  the renderer type
-   */
-  public void setRendererType(
-    String rendererType)
-  {
-    _rendererType = rendererType;
-  }
-
-  /**
-   * Returns the renderer type for this component.
-   *
-   * @return  the renderer type
-   */
-  public String getRendererType()
-  {
-    return _rendererType;
-  }
-
-  /**
-   * Returns the default renderer type for this component.
-   *
-   * @return  the default renderer type
-   */
-  public String getDefaultRendererType()
-  {
-    ComponentBean parent = resolveSupertype();
-    return (parent != null) ? parent.findRendererType() : null;
-  }
-
-  public String getImplementationType()
-  {
-    return _implementationType;
-  }
-
-  public void setImplementationType(String implementationType)
-  {
-    _implementationType = implementationType;
-  }
-
-
-  /**
-   * Adds a property to this component.
-   *
-   * @param property  the property to add
-   */
-  public void addProperty(
-    PropertyBean property)
-  {
-    _properties.put(property.getPropertyName(), property);
-  }
-
-  /**
-   * Returns the property for this property name.
-   *
-   * @param propertyName  the property name to find
-   */
-  public PropertyBean findProperty(
-    String propertyName)
-  {
-    return (PropertyBean)_properties.get(propertyName);
-  }
-
-  /**
-   * Returns the property for this property name.
-   *
-   * @param propertyName  the property name to find
-   */
-  public PropertyBean findProperty(
-    String propertyName,
-    boolean flatten)
-  {
-    PropertyBean prop = findProperty(propertyName);
-    if (prop == null && flatten)
-    {
-      ComponentBean parent = resolveSupertype();
-      if (parent != null)
-        prop = parent.findProperty(propertyName, flatten);
-    }
-
-    return prop;
-  }
-
-
-  /**
-   * Returns true if this component has any properties.
-   *
-   * @return  true   if this component has any properties,
-   *          false  otherwise
-   */
-  public boolean hasProperties()
-  {
-    return hasProperties(false);
-  }
-
-  /**
-   * Returns true if this component or any component supertype
-   * has any properties.
-   *
-   * @return  true   if this component or any supertype has any properties,
-   *          false  otherwise
-   */
-  public boolean hasProperties(
-    boolean flatten)
-  {
-    boolean hasProperties = !_properties.isEmpty();
-
-    if (!hasProperties && flatten)
-    {
-      ComponentBean parent = resolveSupertype();
-      if (parent != null)
-        hasProperties |= parent.hasProperties(flatten);
-    }
-
-    return hasProperties;
-  }
-
-  /**
-   * Returns an iterator for all properties on this component only.
-   *
-   * @return  the property iterator
-   */
-  public Iterator properties()
-  {
-    return _properties.values().iterator();
-  }
-
-  /**
-   * Returns an iterator for properties on this component.
-   *
-   * @param flatten  true   if the iterator should be a combined list of
-   *                        properties of this component and its supertype,
-   *                 false  otherwise
-   *
-   * @return  the property iterator
-   */
-  public Iterator properties(
-    boolean flatten)
-  {
-    Iterator properties = properties();
-    if (flatten)
-    {
-      ComponentBean parent = resolveSupertype();
-      if (parent != null)
-        properties = new CompoundIterator(parent.properties(true), properties);
-    }
-    return properties;
-  }
-
- /**
-  * Number of properties for this component
-  * @return num of properties
-  */
-  public int propertiesSize()
-  {
-    return _properties.size();
-  }
-
-  /**
-   * Adds a facet to this component.
-   *
-   * @param facet  the facet to add
-   */
-  public void addFacet(
-    FacetBean facet)
-  {
-    _facets.put(facet.getFacetName(), facet);
-  }
-
-  /**
-   * Returns the facet for this facet name.
-   *
-   * @param facetName  the facet name to find
-   */
-  public FacetBean findFacet(
-    String facetName)
-  {
-    return (FacetBean)_facets.get(facetName);
-  }
-
-
-  public FacetBean findFacet(
-    String facetName,
-    boolean flatten)
-  {
-    FacetBean facet = findFacet(facetName);
-    if (facet == null && flatten)
-    {
-      ComponentBean parent = resolveSupertype();
-      if (parent != null)
-        facet = parent.findFacet(facetName, flatten);
-    }
-
-    return facet;
-  }
-
-  /**
-   * Returns true if this component has any facets.
-   *
-   * @return  true   if this component has any facets,
-   *          false  otherwise
-   */
-  public boolean hasFacets()
-  {
-    return hasFacets(false);
-  }
-
-  /**
-   * Returns true if this component or any component supertype
-   * has any facets.
-   *
-   * @return  true   if this component or any supertype has any facets,
-   *          false  otherwise
-   */
-  public boolean hasFacets(
-    boolean flatten)
-  {
-    boolean hasFacets = !_facets.isEmpty();
-
-    if (!hasFacets && flatten)
-    {
-      ComponentBean parent = resolveSupertype();
-      if (parent != null)
-        hasFacets |= parent.hasFacets(flatten);
-    }
-
-    return hasFacets;
-  }
-
-  /**
-   * Returns an iterator for all facets on this component only.
-   *
-   * @return  the facet iterator
-   */
-  public Iterator facets()
-  {
-    return _facets.values().iterator();
-  }
-
-  /**
-   * Returns an iterator for facets on this component.
-   *
-  * @param flatten  true   if the iterator should be a combined list of
-  *                        facets of this component and its supertype,
-  *                 false  otherwise
-  *
-  * @return  the facet iterator
-  */
-  public Iterator facets(
-   boolean flatten)
-  {
-    Iterator facets = facets();
-    if (flatten)
-    {
-      ComponentBean parent = resolveSupertype();
-      if (parent != null)
-        facets = new CompoundIterator(facets, parent.facets(true));
-    }
-    return facets;
-  }
-
-  /**
-   * Specifies if the component can have children.
-   *
-   * @param children  true  if the component can have children.
-   *                  false otherwise
-   */
-  public void setChildren(
-    boolean children)
-  {
-    _children = children;
-  }
-
-
-  /**
-   * Returns true if the component can have children.
-   *
-   * @return  true  if the component can have children.
-   *          false otherwise
-   */
-  public boolean hasChildren()
-  {
-    return _children;
-  }
-
-  /**
-   * Adds a Java Language class modifier to the component class.
-   *
-   * @param modifier  the modifier to be added
-   */
-  public void addComponentClassModifier(
-    int modifier)
-  {
-    _componentClassModifiers |= modifier;
-  }
-
-  /**
-   * Returns the Java Language class modifiers for the component class.
-   * By default, these modifiers include Modifier.PUBLIC.
-   *
-   * @return  the Java Language class modifiers for the component class
-   */
-  public int getComponentClassModifiers()
-  {
-    int modifiers = _componentClassModifiers;
-
-    if (!Modifier.isPrivate(modifiers) &&
-        !Modifier.isProtected(modifiers) &&
-        !Modifier.isPublic(modifiers))
-    {
-      modifiers |= Modifier.PUBLIC;
-    }
-
-    return modifiers;
-  }
-
-  public void parseComponentClassModifier(
-    String modifier)
-  {
-    addComponentClassModifier(_parseModifier(modifier));
-  }
-
-  public void parseTagClassModifier(
-    String modifier)
-  {
-    addTagClassModifier(_parseModifier(modifier));
-  }
-
-  private int _parseModifier(
-    String text)
-  {
-    if ("public".equals(text))
-      return Modifier.PUBLIC;
-    else if ("protected".equals(text))
-      return Modifier.PROTECTED;
-    else if ("private".equals(text))
-      return Modifier.PRIVATE;
-    else if ("abstract".equals(text))
-      return Modifier.ABSTRACT;
-    else if ("final".equals(text))
-      return Modifier.FINAL;
-
-    throw new IllegalArgumentException("Unrecognized modifier: " + text);
-  }
-
-  /**
-   * Parses the unsupported agents for this component into a String array
-   * using space as the separator between values.
-   *
-   * @param unsupportedAgents  the unsupported agents
-   */
-  public void parseUnsupportedAgents(
-    String unsupportedAgents)
-  {
-    setUnsupportedAgents(unsupportedAgents.split(" "));
-  }
-  
-  /**
-   * Adds a Java Language class modifier to the tag class.
-   *
-   * @param modifier  the modifier to be added
-   */
-  public void addTagClassModifier(
-    int modifier)
-  {
-    _tagClassModifiers |= modifier;
-  }
-
-  /**
-   * Returns the Java Language class modifiers for the tag class.
-   * By default, these modifiers include Modifier.PUBLIC.
-   *
-   * @return  the Java Language class modifiers for the tag class
-   */
-  public int getTagClassModifiers()
-  {
-    int modifiers = _tagClassModifiers;
-
-    if (!Modifier.isPrivate(modifiers) &&
-        !Modifier.isProtected(modifiers) &&
-        !Modifier.isPublic(modifiers))
-    {
-      modifiers |= Modifier.PUBLIC;
-    }
-
-    return modifiers;
-  }
-
-  /**
-   * Adds an event to this component.
-   *
-   * @param eventRef  the event to add
-   */
-  public void addEvent(
-    EventRefBean eventRef)
-  {
-    if (eventRef.getEventType() == null)
-    {
-      _LOG.warning("Missing event type in component \"" +
-                   _componentType + "\"");
-    }
-    else
-    {
-      _events.put(eventRef.getEventType(), eventRef);
-    }
-  }
-
-  /**
-   * Returns true if this component has any events.
-   *
-   * @return  true   if this component has any events,
-   *          false  otherwise
-   */
-  public boolean hasEvents()
-  {
-    return hasEvents(false);
-  }
-
-  /**
-   * Returns true if this component or any component supertype
-   * has any events.
-   *
-   * @return  true   if this component or any supertype has any events,
-   *          false  otherwise
-   */
-  public boolean hasEvents(
-    boolean flatten)
-  {
-    boolean hasEvents = !_events.isEmpty();
-
-    if (!hasEvents && flatten)
-    {
-      ComponentBean parent = resolveSupertype();
-      if (parent != null)
-        hasEvents |= parent.hasEvents(flatten);
-    }
-
-    return hasEvents;
-  }
-
-  /**
-   * Returns the event for this event name.
-   *
-   * @param eventName  the event name to find
-   */
-  public EventBean findEvent(
-    String eventName)
-  {
-    return (EventBean)_events.get(eventName);
-  }
-
-  public EventBean findEvent(
-    String eventName,
-    boolean flatten)
-  {
-    EventBean event = findEvent(eventName);
-    if (event == null && flatten)
-    {
-      ComponentBean parent = resolveSupertype();
-      if (parent != null)
-        event = parent.findEvent(eventName, flatten);
-    }
-
-    return event;
-  }
-
-
-  /**
-   * Returns an iterator for all events on this component only.
-   *
-   * @return  the event iterator
-   */
-  public Iterator events()
-  {
-    return _events.values().iterator();
-  }
-
-  /**
-   * Returns an iterator for events on this component.
-   *
-  * @param flatten  true   if the iterator should be a combined list of
-  *                        events of this component and its supertype,
-  *                 false  otherwise
-  *
-  * @return  the event iterator
-  */
-  public Iterator events(
-   boolean flatten)
-  {
-    Iterator events = events();
-    if (flatten)
-    {
-      ComponentBean parent = resolveSupertype();
-      if (parent != null)
-        events = new CompoundIterator(events, parent.events(true));
-    }
-    return events;
-  }
-
-  /**
-   * Finds the component family in the component inheritance
-   * hierarchy.
-   *
-   * @return  the component family
-   */
-  public String findComponentFamily()
-  {
-    if (_componentFamily != null)
-      return _componentFamily;
-
-    ComponentBean parent = resolveSupertype();
-    return (parent != null) ? parent.findComponentFamily() : null;
-  }
-
-  /**
-   * Finds the behavioral component component inheritance
-   * hierarchy.
-   *
-   * @return  the behavioral component
-   */
-  public ComponentBean findBehavioralComponent()
-  {
-    if (_componentFamily != null)
-      return this;
-
-    ComponentBean component = resolveSupertype();
-    return (component != null) ? component.findBehavioralComponent() : this;
-  }
-
-  /**
-   * Finds the renderer type in the component inheritance
-   * hierarchy.
-   *
-   * @return  the renderer type
-   */
-  public String findRendererType()
-  {
-    if (_rendererType != null)
-      return _rendererType;
-
-    ComponentBean parent = resolveSupertype();
-    return (parent != null) ? parent.findRendererType() : null;
-  }
-
-
-  /**
-   * Finds the component superclass in the component inheritance
-   * hierarchy.
-   *
-   * @return  the component superclass
-   */
-  public String findComponentSuperclass()
-  {
-    if (_componentSuperclass != null)
-      return _componentSuperclass;
-
-    ComponentBean parent = resolveSupertype();
-    return (parent != null) ? parent.findComponentClass()
-                            : (isTrinidadComponent() ? 
-                   _TRINIDAD_COMPONENT_BASE : _JSF_COMPONENT_BASE);
-  }
-
-  /**
-   * Finds the tag superclass in the component inheritance
-   * hierarchy.
-   *
-   * @return  the tag superclass
-   */
-  public String findJspTagSuperclass()
-  {
-    if (_tagSuperclass != null)
-      return _tagSuperclass;
-
-    ComponentBean parent = resolveSupertype();
-    return (parent != null) ? parent.findJspTagClass()
-                            : (isTrinidadComponent() ?
-                  _TRINIDAD_COMPONENT_TAG : _JSF_COMPONENT_TAG);
-  }
-
-  /**
-   * Returns the component supertype instance.
-   *
-   * @return  the component supertype instance
-   */
-  public ComponentBean resolveSupertype()
-  {
-    if (_componentSupertype == null)
-      return null;
-
-    FacesConfigBean owner = getOwner();
-    return (owner != null) ? owner.findComponent(_componentSupertype) : null;
-  }
-
-  /**
-   * Checks if any of the component superclasses is UIXComponentBase
-   */
-  public boolean isTrinidadComponent()
-  {
-    String implementationType = getImplementationType();
-    if (implementationType != null)
-      return "trinidad".equals(implementationType);
-
-    ComponentBean componentSupertype = resolveSupertype();
-    if (componentSupertype != null)
-    {
-      if (_TRINIDAD_COMPONENT_BASE.equals(componentSupertype.getComponentClass()))
-      {
-        return true;
-      }
-      else
-      {
-        return componentSupertype.isTrinidadComponent();
-      }
-    }
-    
-    return false;
-  }
-
-  /**
-   * Finds the component class in the component inheritance
-   * hierarchy.
-   *
-   * @return  the component class
-   */
-  protected String findComponentClass()
-  {
-    if (_componentClass != null)
-      return _componentClass;
-
-    ComponentBean parent = resolveSupertype();
-    return (parent != null) ? parent.findComponentClass() : null;
-  }
-
-  /**
-   * Finds the tag class in the component inheritance
-   * hierarchy.
-   *
-   * @return  the tag class
-   */
-  protected String findJspTagClass()
-  {
-    if (_tagClass != null)
-      return _tagClass;
-
-    ComponentBean parent = resolveSupertype();
-    return (parent != null) ? parent.findJspTagClass() : null;
-  }
-
-  /**
-   * Attaches the component and all event references.
-   *
-   * @param owner  the faces config owner
-   */
-  protected void attach(
-    FacesConfigBean owner)
-  {
-    super.attach(owner);
-    Iterator events = events(false);
-    while (events.hasNext())
-    {
-      EventRefBean eventRef = (EventRefBean)events.next();
-      eventRef.attach(owner);
-    }
-  }
-
-  public void setComponentClassExcluded(boolean componentClassExcluded)
-  {
-    _componentClassExcluded = componentClassExcluded;
-  }
-
-  public boolean isComponentClassExcluded()
-  {
-    return _componentClassExcluded;
-  }
-  
-  public void setTagClassExcluded(boolean tagClassExcluded)
-  {
-    _tagClassExcluded = tagClassExcluded;
-  }
-
-  public boolean isTagClassExcluded()
-  {
-    return _tagClassExcluded;
-  }
-
-  public void setComponentImplements(String componentImplements)
-  {
-    this._componentImplements = componentImplements;
-  }
-
-  public String getComponentImplements()
-  {
-    return _componentImplements;
-  }
-
-  public void setComponentSerialUID(String componentSerialUID)
-  {
-    this._componentSerialUID = componentSerialUID;
-  }
-
-  public String getComponentSerialUID()
-  {
-    return _componentSerialUID;
-  }
-
-  private String _componentSerialUID;
-  private String _componentImplements;
-  private boolean _tagClassExcluded;
-  private boolean _componentClassExcluded;  
-  private String  _description;
-  private String  _longDescription;
-  private String  _componentType;
-  private String  _componentFamily;
-  private String  _componentClass;
-  private String  _componentSupertype;
-  private String  _componentSuperclass;
-  private String  _rendererType;
-  private String  _implementationType;
-  private QName   _tagName;
-  private String  _tagClass;
-  private String  _tagHandler;
-  private String  _tagSuperclass;
-  private String  _localName;
-  private String  _nodeClass;
-  private boolean _namingContainer;
-  private boolean _children = true;
-  private Map     _properties;
-  private Map     _facets;
-  private Map     _events;
-  private int     _componentClassModifiers;
-  private int     _tagClassModifiers;
-  private String[] _unsupportedAgents = new String[0];
-
-  static private final String _TRINIDAD_COMPONENT_BASE =
-                         "org.apache.myfaces.trinidad.component.UIXComponentBase";
-
-  static private final String _TRINIDAD_COMPONENT_TAG =
-                         "org.apache.myfaces.trinidad.webapp.UIXComponentTag";
-
-  static private final String _JSF_COMPONENT_BASE =
-                         "javax.faces.component.UIComponentBase";
-
-  static private final String _JSF_COMPONENT_TAG =
-                         "javax.faces.webapp.UIComponentTag";
-  
-  static private final Logger _LOG = Logger.getLogger(ComponentBean.class.getName());
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/ConverterBean.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/ConverterBean.java
deleted file mode 100644
index 5c651e0..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/ConverterBean.java
+++ /dev/null
@@ -1,160 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse;
-
-import java.lang.reflect.Modifier;
-import java.util.logging.Logger;
-
-/**
- * ConverterBean is a Java representation of the faces-config converter
- * XML element.
- */
-public class ConverterBean extends AbstractTagBean
-{
-
-  /**
-   * Sets the converter identifer for this component.
-   *
-   * @param converterId  converter identifer
-   */
-  public void setConverterId(
-    String converterId)
-  {
-    _converterId = converterId;
-  }
-
-  /**
-   * Returns true if the converter identifier is specified, otherwise false.
-   *
-   * @return  true if the converter identifier is specified,
-   *          otherwise false.
-   */
-  public boolean hasConverterId()
-  {
-    return (_converterId != null);
-  }
-
-  /**
-   * Returns the converter identifier for this component.
-   *
-   * @return  the converter identifier
-   */
-  public String getConverterId()
-  {
-    return _converterId;
-  }
-
-  /**
-   * Sets the converter class for this component.
-   *
-   * @param converterClass  the converter class
-   */
-  public void setConverterClass(
-    String converterClass)
-  {
-    _converterClass = converterClass;
-  }
-
-  /**
-   * Returns the converter class for this component.
-   *
-   * @return  the converter class
-   */
-  public String getConverterClass()
-  {
-    return _converterClass;
-  }
-
-  /**
-   * Sets the converter super class for this component.
-   *
-   * @param converterSuperClass  the converter super class
-   */
-  public void setConverterSuperClass(
-    String converterSuperClass)
-  {
-    _converterSuperClass = converterSuperClass;
-  }
-
-  /**
-   * Returns the converter super class for this component.
-   *
-   * @return  the converter super class
-   */
-  public String getConverterSuperClass()
-  {
-    return _converterSuperClass;
-  }
-
-  /**
-   * Adds a Java Language class modifier to the converter class.
-   *
-   * @param modifier  the modifier to be added
-   */
-  public void addConverterClassModifier(
-    int modifier)
-  {
-    _converterClassModifiers |= modifier;
-  }
-
-  /**
-   * Returns the Java Language class modifiers for the converter class.
-   * By default, these modifiers include Modifier.PUBLIC.
-   *
-   * @return  the Java Language class modifiers for the converter class
-   */
-  public int getConverterClassModifiers()
-  {
-    int modifiers = _converterClassModifiers;
-
-    if (!Modifier.isPrivate(modifiers) &&
-        !Modifier.isProtected(modifiers) &&
-        !Modifier.isPublic(modifiers))
-    {
-      modifiers |= Modifier.PUBLIC;
-    }
-
-    return modifiers;
-  }
-
-  public void parseConverterClassModifier(
-    String modifier)
-  {
-    addConverterClassModifier(_parseModifier(modifier));
-  }
-
-  public void setTagClassExcluded(boolean tagClassExcluded)
-  {
-    _tagClassExcluded = tagClassExcluded;
-  }
-
-  public boolean isTagClassExcluded()
-  {
-    return _tagClassExcluded;
-  }
-
-  private boolean _tagClassExcluded;
-  private String  _converterId;
-  private String  _converterClass;
-  private String  _converterSuperClass;
-  private int     _converterClassModifiers;
-
-
-  static private final Logger _LOG = Logger.getLogger(ConverterBean.class.getName());
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/EventBean.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/EventBean.java
deleted file mode 100644
index ee02d07..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/EventBean.java
+++ /dev/null
@@ -1,143 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-
-/**
- * EventBean is a Java representation of the faces-config-extension
- * event XML element.
- */
-public class EventBean extends ObjectBean
-{
-  public String getEventName()
-  {
-    return Util.getEventNameFromEventType(_eventType);
-  }
-
-  /**
-   * Sets the description of this property.
-   *
-   * @param description  the property description
-   */
-  public void setDescription(
-    String description)
-  {
-    _description = description;
-  }
-
-  /**
-   * Returns the description of this property.
-   *
-   * @return  the property description
-   */
-  public String getDescription()
-  {
-    return _description;
-  }
-
-  /**
-   * Sets the event type for this event.
-   *
-   * @param eventType  the event type
-   */
-  public void setEventType(
-    String eventType)
-  {
-    _eventType = eventType;
-  }
-
-  /**
-   * Returns the event type for this event.
-   *
-   * @return  the event type
-   */
-  public String getEventType()
-  {
-    return _eventType;
-  }
-
-  /**
-   * Sets the event class for this event.
-   *
-   * @param eventName  the event class
-   */
-  public void setEventClass(
-    String eventClass)
-  {
-    _eventClass = eventClass;
-  }
-
-  /**
-   * Returns the event class for this event.
-   *
-   * @return  the event class
-   */
-  public String getEventClass()
-  {
-    return _eventClass;
-  }
-
-  /**
-   * Sets the event listener class for this event.
-   *
-   * @param eventListenerClass  the event listener class
-   */
-  public void setEventListenerClass(
-    String eventListenerClass)
-  {
-    _eventListenerClass = eventListenerClass;
-  }
-
-  /**
-   * Returns the event listener class for this event.
-   *
-   * @return  the event listener class
-   */
-  public String getEventListenerClass()
-  {
-    return _eventListenerClass;
-  }
-
-  /**
-   * Sets the event source interface for this event.
-   *
-   * @param eventSourceInterface  the event source interface
-   */
-  public void setEventSourceInterface(
-    String eventSourceInterface)
-  {
-    _eventSourceInterface = eventSourceInterface;
-  }
-
-  /**
-   * Returns the event source interface for this event.
-   *
-   * @return  the event source interface
-   */
-  public String getEventSourceInterface()
-  {
-    return _eventSourceInterface;
-  }
-
-  private String _description;
-  private String _eventType;
-  private String _eventClass;
-  private String _eventListenerClass;
-  private String _eventSourceInterface;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/EventRefBean.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/EventRefBean.java
deleted file mode 100644
index d4717e6..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/EventRefBean.java
+++ /dev/null
@@ -1,127 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.Util;
-
-/**
- * EventBean is a Java representation of the faces-config component-extension
- * event XML element.
- */
-public class EventRefBean extends ObjectBean
-{
-  public String getEventName()
-  {
-    return Util.getEventNameFromEventType(_eventType);
-  }
-
-  /**
-   * Sets the event type for this event reference.
-   *
-   * @param eventType  the event type
-   */
-  public void setEventType(
-    String eventType)
-  {
-    _eventType = eventType;
-  }
-
-  /**
-   * Returns the event type for this event.
-   *
-   * @return  the event type
-   */
-  public String getEventType()
-  {
-    return _eventType;
-  }
-
-  /**
-   * Sets the delivery phases for this event.
-   *
-   * @param deliveryPhases  the event delivery phases
-   */
-  public void setEventDeliveryPhases(
-    String[] deliveryPhases)
-  {
-    if ((_deliveryPhases != null) && (_deliveryPhases.length > 0))
-    {
-      int oldLen = _deliveryPhases.length;
-      int newLen = deliveryPhases.length;
-      String[] newDeliveryPhases = new String[oldLen + newLen];
-      System.arraycopy(_deliveryPhases, 0, newDeliveryPhases, 0, oldLen);
-      System.arraycopy(deliveryPhases, 0, newDeliveryPhases, oldLen, newLen);
-      _deliveryPhases = newDeliveryPhases;
-    }
-    else
-    {
-      _deliveryPhases = deliveryPhases;
-    }
-    
-  }
-
-  /**
-   * Returns the delivery phases for this event.
-   *
-   * @return  the event delivery phases
-   */
-  public String[] getEventDeliveryPhases()
-  {
-    return _deliveryPhases;
-  }
-
-  /**
-   * Sets a flag indicating whether or not to automatically implement
-   * the event source interface on the generated component source.
-   *
-   * @param ignoreSourceInterface  true,  to ignore the event source interface;
-   *                               false, otherwise
-   */
-  public void setIgnoreSourceInterface(
-    boolean ignoreSourceInterface)
-  {
-    _ignoreSourceInterface = ignoreSourceInterface;
-  }
-
-  /**
-   * Returns a flag indicating whether or not to automatically implement
-   * the event source interface on the generated component source.
-   *
-   * @return  true,  to ignore the event source interface;
-   *          false, otherwise
-   */
-  public boolean isIgnoreSourceInterface()
-  {
-    return _ignoreSourceInterface;
-  }
-
-  /**
-   * Resolves the event type.
-   *
-   * @return  the event with the referencing event type,
-   *          or null if not found
-   */
-  public EventBean resolveEventType()
-  {
-    return getOwner().findEvent(_eventType);
-  }
-
-  private String   _eventType;
-  private String[] _deliveryPhases;
-  private boolean  _ignoreSourceInterface;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/FacesConfigBean.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/FacesConfigBean.java
deleted file mode 100644
index 4fa10fd..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/FacesConfigBean.java
+++ /dev/null
@@ -1,315 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse;
-
-import java.net.URL;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.logging.Logger;
-
-/**
- * FacesConfigBean is a Java representation of the faces-config XML element.
- */
-public class FacesConfigBean extends ObjectBean
-{
-  /**
-   * Adds a converter to this faces config document.
-   *
-   * @param converter  the converter to add
-   */
-  public void addConverter(
-    ConverterBean converter)
-  {
-    converter.attach(this);
-    if (converter.hasConverterId())
-      _converters.put(converter.getConverterId(), converter);
-  }
-
-  /**
-   * Returns the converter for this converter type.
-   *
-   * @param converterId  the converter type to find
-   */
-  public ConverterBean findConverter(
-    String converterId)
-  {
-    return (ConverterBean)_converters.get(converterId);
-  }
-
-  /**
-   * Returns true if this faces config has any converters.
-   *
-   * @return true  if this faces config has any converters,
-   *         otherwise false
-   */
-  public boolean hasConverters()
-  {
-    return !_converters.isEmpty();
-  }
-
-  /**
-   * Returns an iterator for all converters in this faces
-   * config.
-   *
-   * @return  the converter iterator
-   */
-  public Iterator converters()
-  {
-    return _converters.values().iterator();
-  }
-
-  /**
-   * Adds a validator to this faces config document.
-   *
-   * @param validator  the validator to add
-   */
-  public void addValidator(
-    ValidatorBean validator)
-  {
-    validator.attach(this);
-    if (validator.hasValidatorId())
-      _validators.put(validator.getValidatorId(), validator);
-  }
-
-  /**
-   * Returns the validator for this validator type.
-   *
-   * @param validatorId  the validator type to find
-   */
-  public ValidatorBean findValidator(
-    String validatorId)
-  {
-    return (ValidatorBean)_validators.get(validatorId);
-  }
-
-  /**
-   * Returns true if this faces config has any validators.
-   *
-   * @return true  if this faces config has any validators,
-   *         otherwise false
-   */
-  public boolean hasValidators()
-  {
-    return !_validators.isEmpty();
-  }
-
-  /**
-   * Returns an iterator for all validators in this faces
-   * config.
-   *
-   * @return  the validator iterator
-   */
-  public Iterator validators()
-  {
-    return _validators.values().iterator();
-  }
-
-  /**
-   * Adds a component to this faces config document.
-   *
-   * @param component  the component to add
-   */
-  public void addComponent(
-    ComponentBean component)
-  {
-    // Generic "includes" will not have a component type
-    if (component.getComponentType() != null)
-    {
-      component.attach(this);
-      _components.put(component.getComponentType(), component);
-    }
-  }
-
-  /**
-   * Returns the component for this component type.
-   *
-   * @param componentType  the component type to find
-   */
-  public ComponentBean findComponent(
-    String componentType)
-  {
-    return (ComponentBean)_components.get(componentType);
-  }
-
-  /**
-   * Returns true if this faces config has any components.
-   *
-   * @return true  if this faces config has any components,
-   *         otherwise false
-   */
-  public boolean hasComponents()
-  {
-    return !_components.isEmpty();
-  }
-
-  /**
-   * Returns an iterator for all components in this faces
-   * config.
-   *
-   * @return  the component iterator
-   */
-  public Iterator components()
-  {
-    return _components.values().iterator();
-  }
-
-  /**
-   * Adds an event to this faces config document.
-   *
-   * @param event  the event to add
-   */
-  public void addEvent(
-    EventBean event)
-  {
-    if (event.getEventType() == null)
-    {
-      _warning("Missing event type");
-    }
-    else if (event.getEventListenerClass() == null)
-    {
-      _warning("Event \"" + event.getEventType() + "\" " +
-                   "has no listener class");
-    }
-    else if (event.getEventClass() == null)
-    {
-      _warning("Event \"" + event.getEventType() + "\" " +
-                   "has no event class");
-    }
-    else
-    {
-      event.attach(this);
-      _events.put(event.getEventType(), event);
-    }
-  }
-
-  private void _warning(String s)
-  {
-    _LOG.warning(s+"\n  parsing resource:"+getCurrentResource());
-  }
-
-  /**
-   * Returns the event for this event type.
-   *
-   * @param eventType  the event type to find
-   */
-  public EventBean findEvent(
-    String eventType)
-  {
-    return (EventBean)_events.get(eventType);
-  }
-
-  /**
-   * Returns true if this faces config has any events.
-   *
-   * @return true  if this faces config has any events,
-   *         otherwise false
-   */
-  public boolean hasEvents()
-  {
-    return !_events.isEmpty();
-  }
-
-  /**
-   * Returns an iterator for all events in this faces
-   * config.
-   *
-   * @return  the event iterator
-   */
-  public Iterator events()
-  {
-    return _events.values().iterator();
-  }
-
-  /**
-   * Adds a render kit to this faces config document.
-   *
-   * @param renderKit  the render kit to add
-   */
-  public void addRenderKit(
-    RenderKitBean renderKit)
-  {
-    String renderKitId = renderKit.getRenderKitId();
-    RenderKitBean existing = findRenderKit(renderKitId);
-
-    if (existing == null)
-    {
-      renderKit.attach(this);
-      _renderKits.put(renderKitId, renderKit);
-    }
-    else
-    {
-      existing.addAllRenderers(renderKit);
-    }
-  }
-
-  /**
-   * Returns the render kit for this render kit id.
-   *
-   * @param renderKitId  the render kit id to find
-   */
-  public RenderKitBean findRenderKit(
-    String renderKitId)
-  {
-    return (RenderKitBean)_renderKits.get(renderKitId);
-  }
-
-  /**
-   * Returns true if this faces config has any render kits.
-   *
-   * @return true  if this faces config has any render kits,
-   *         otherwise false
-   */
-  public boolean hasRenderKits()
-  {
-    return !_renderKits.isEmpty();
-  }
-
-  /**
-   * Returns an iterator for all render kits in this faces
-   * config.
-   *
-   * @return  the render kit iterator
-   */
-  public Iterator renderKits()
-  {
-    return _renderKits.values().iterator();
-  }
-
-  public URL getCurrentResource()
-  {
-    return _currentResource;
-  }
-  
-  public URL setCurrentResource(URL resource)
-  {
-    URL _cur = _currentResource;
-    _currentResource = resource;
-    return _cur;
-  }
-
-  private Map _converters = new TreeMap();
-  private Map _validators = new TreeMap();
-  private Map _components = new TreeMap();
-  private Map _events = new TreeMap();
-  private Map _renderKits = new TreeMap();
-  private URL _currentResource = null;
-
-  static private final Logger _LOG = Logger.getLogger(FacesConfigBean.class.getName());
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/FacesConfigParser.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/FacesConfigParser.java
deleted file mode 100644
index 1c21118..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/FacesConfigParser.java
+++ /dev/null
@@ -1,425 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse;
-
-import org.apache.commons.digester.AbstractObjectCreationFactory;
-import org.apache.commons.digester.Digester;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.rules.BeanPropertySetterRule;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.XIncludeFilter;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParserFactory;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.URLConnection;
-
-public class FacesConfigParser
-{
-  public void merge(
-    FacesConfigBean owner,
-    URL             url) throws MojoExecutionException
-  {
-    try
-    {
-      URLConnection conn = url.openConnection();
-      long lastModified = conn.getLastModified();
-      InputStream is = conn.getInputStream();
-
-      if (is != null)
-      {
-        // Establish the current last-modified value
-        // As new components are added, they will remember
-        // this current value as their own last-modified
-        owner.touch(lastModified);
-
-        Digester digester = createDigester();
-        digester.push(url);
-        digester.push(owner);
-        digester.parse(is);
-        is.close();
-      }
-    }
-    catch (IOException e)
-    {
-      throw new MojoExecutionException("Failed to parse " + url, e);
-    }
-    catch (SAXException e)
-    {
-      throw new MojoExecutionException("Failed to parse " + url, e);
-    }
-    catch (ParserConfigurationException e)
-    {
-      throw new MojoExecutionException("Failed to parse " + url, e);
-    }
-  }
-
-
-  static protected Digester createEmptyDigester()
-    throws ParserConfigurationException, SAXException
-  {
-    SAXParserFactory spf = SAXParserFactory.newInstance();
-    spf.setNamespaceAware(true);
-    // requires JAXP 1.3, in JavaSE 5.0
-    // spf.setXIncludeAware(true);
-    Digester digester = new Digester(spf.newSAXParser());
-    digester.setNamespaceAware(true);
-    
-    return digester;
-  }
-
-  static protected void addComponentDigesterRules(Digester digester, boolean withCreate)
-  {
-    digester.setRuleNamespaceURI("http://java.sun.com/xml/ns/javaee");
-
-    // faces-config/component
-    // Only use if we're creating the component;  turn this off
-    // when we're simply including content
-    if (withCreate)
-    {
-      // faces-config/component
-      digester.addObjectCreate("faces-config/component", ComponentBean.class);
-      digester.addBeanPropertySetter("faces-config/component/component-type",
-                                     "componentType");
-      digester.addBeanPropertySetter("faces-config/component/component-class",
-                                     "componentClass");
-      digester.addBeanPropertySetter("faces-config/component/description");
-      digester.addSetNext("faces-config/component", "addComponent",
-                          ComponentBean.class.getName());
-    }
-
-    // faces-config/component/property
-    digester.addObjectCreate("faces-config/component/property", PropertyBean.class);
-    digester.addBeanPropertySetter("faces-config/component/property/property-name",
-                                   "propertyName");
-    digester.addBeanPropertySetter("faces-config/component/property/property-class",
-                                   "propertyClass");
-    digester.addBeanPropertySetter("faces-config/component/property/description");
-    digester.addBeanPropertySetter("faces-config/component/property/default-value",
-                                   "defaultValue");
-    digester.addSetNext("faces-config/component/property", "addProperty",
-                        PropertyBean.class.getName());
-    
-
-    // faces-config/component/facet
-    digester.addObjectCreate("faces-config/component/facet", FacetBean.class);
-    digester.addBeanPropertySetter("faces-config/component/facet/facet-name",
-                                   "facetName");
-    digester.addBeanPropertySetter("faces-config/component/facet/description");
-    digester.addSetNext("faces-config/component/facet", "addFacet",
-                        FacetBean.class.getName());
-
-    // Maven Faces Plugin
-    digester.setRuleNamespaceURI("http://myfaces.apache.org/maven-faces-plugin");
-
-    // faces-config/component/component-extension
-    digester.addBeanPropertySetter("faces-config/component/component-extension/long-description",
-                                   "longDescription");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/component-family",
-                                   "componentFamily");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/component-supertype",
-                                   "componentSupertype");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/component-superclass",
-                                   "componentSuperclass");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/renderer-type",
-                                   "rendererType");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/naming-container",
-                                   "namingContainer");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/accepts-child-components",
-                                   "children");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/tag-class",
-                                   "tagClass");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/tag-superclass",
-                                   "tagSuperclass");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/tag-handler",
-                                   "tagHandler");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/implementation-type",
-                                   "implementationType");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/component-class-excluded",
-                                   "componentClassExcluded");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/tag-class-excluded",
-                                   "tagClassExcluded");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/component-implements",
-                                   "componentImplements");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/component-serial-uid",
-                                   "componentSerialUID");
-    
-    digester.addCallMethod("faces-config/component/component-extension/tag-class-modifier",
-                           "parseTagClassModifier", 1);
-    digester.addCallParam("faces-config/component/component-extension/tag-class-modifier", 0);
-    digester.addCallMethod("faces-config/component/component-extension/unsupported-agents",
-                           "parseUnsupportedAgents", 1);
-    digester.addCallParam("faces-config/component/component-extension/unsupported-agents", 0);
-
-    digester.addCallMethod("faces-config/component/component-extension/component-class-modifier",
-                           "parseComponentClassModifier", 1);
-    digester.addCallParam("faces-config/component/component-extension/component-class-modifier", 0);
-    digester.addRule("faces-config/component/component-extension/tag-name",
-                     new BeanPropertySetterRule("tagName"));
-    digester.addBeanPropertySetter("faces-config/component/component-extension/uix2-local-name",
-                                   "localName");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/uix2-node-class",
-                                   "nodeClass");
-
-    // faces-config/component/component-extension/event
-    digester.addObjectCreate("faces-config/component/component-extension/event", EventRefBean.class);
-    digester.addBeanPropertySetter("faces-config/component/component-extension/event/event-type",
-                                   "eventType");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/event/event-delivery-phase",
-                                   "eventDeliveryPhases");
-    digester.addBeanPropertySetter("faces-config/component/component-extension/event/ignore-source-interface",
-                                   "ignoreSourceInterface");
-    digester.addSetNext("faces-config/component/component-extension/event", "addEvent",
-                        EventRefBean.class.getName());
-
-    // faces-config/component/property/property-extension
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/state-holder",
-                                   "stateHolder");
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/jsp-property-name",
-                                   "jspPropertyName");
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/list",
-                                   "list");
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/required");
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/alias-of",
-                                   "aliasOf");
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/virtual");
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/transient");
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/literal-only",
-                                   "literalOnly");
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/enum",
-                                   "enum");
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/alternate-class",
-                                   "alternateClass");
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/tag-attribute-excluded",
-                                   "tagAttributeExcluded");
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/is-set-method",
-                                   "isSetMethod");
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/is-set-method-scope",
-                                   "isSetMethodScope");
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/is-get-local-method",
-                                   "isGetLocalMethod");
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/is-get-local-method-scope",
-                                    "isGetLocalMethodScope");
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/rtexprvalue",
-                                    "rtexprvalue");
-    
-    digester.addCallMethod("faces-config/component/property/property-extension/property-values",
-                           "parsePropertyValues", 1);
-    digester.addCallParam("faces-config/component/property/property-extension/property-values", 0);
-    digester.addCallMethod("faces-config/component/property/property-extension/unsupported-agents",
-                           "parseUnsupportedAgents", 1);
-    digester.addCallParam("faces-config/component/property/property-extension/unsupported-agents", 0);
-    digester.addCallMethod("faces-config/component/property/property-extension/unsupported-render-kits",
-                           "parseUnsupportedRenderKits", 1);
-    digester.addCallParam("faces-config/component/property/property-extension/unsupported-render-kits", 0);
-
-    digester.addObjectCreate("faces-config/component/property/property-extension/method-binding-signature",
-                             MethodSignatureBean.class);
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/method-binding-signature/return-type",
-                                   "returnType");
-    digester.addCallMethod("faces-config/component/property/property-extension/method-binding-signature/parameter-type",
-                           "addParameterType", 1);
-    digester.addCallParam("faces-config/component/property/property-extension/method-binding-signature/parameter-type", 0);
-    digester.addSetNext("faces-config/component/property/property-extension/method-binding-signature",
-                        "setMethodBindingSignature",
-                        MethodSignatureBean.class.getName());
-    // faces-config/component/property/property-extension/property-metada
-    digester.addBeanPropertySetter("faces-config/component/property/property-extension/property-metadata/use-max-time",
-                                   "useMaxTime");        
-
-
-    // XInclude rules
-    digester.setRuleNamespaceURI(XIncludeFilter.XINCLUDE_NAMESPACE);
-    digester.addFactoryCreate("faces-config/component/include",
-                              ComponentIncludeFactory.class);
-  }
-
-  protected Digester createDigester() throws ParserConfigurationException, SAXException
-  {
-    Digester digester = createEmptyDigester();
-
-    addComponentDigesterRules(digester, true);
-    
-    // Java Enterprise 5.0
-    digester.setRuleNamespaceURI("http://java.sun.com/xml/ns/javaee");
-    //digester.addObjectCreate("faces-config", FacesConfigBean.class);
-
-    // faces-config/converter
-    digester.addObjectCreate("faces-config/converter", ConverterBean.class);
-    digester.addBeanPropertySetter("faces-config/converter/converter-id",
-                                   "converterId");
-    digester.addBeanPropertySetter("faces-config/converter/converter-class",
-                                   "converterClass");
-    digester.addBeanPropertySetter("faces-config/converter/description");
-    digester.addSetNext("faces-config/converter", "addConverter",
-                        ConverterBean.class.getName());
-
-    // faces-config/converter/property
-    digester.addObjectCreate("faces-config/converter/property", PropertyBean.class);
-    digester.addBeanPropertySetter("faces-config/converter/property/property-name",
-                                   "propertyName");
-    digester.addBeanPropertySetter("faces-config/converter/property/property-class",
-                                   "propertyClass");
-    digester.addBeanPropertySetter("faces-config/converter/property/description");
-    digester.addBeanPropertySetter("faces-config/converter/property/default-value",
-                                   "defaultValue");
-    digester.addSetNext("faces-config/converter/property", "addProperty",
-                        PropertyBean.class.getName());
-
-    // faces-config/validator
-    digester.addObjectCreate("faces-config/validator", ValidatorBean.class);
-    digester.addBeanPropertySetter("faces-config/validator/validator-id",
-                                   "validatorId");
-    digester.addBeanPropertySetter("faces-config/validator/validator-class",
-                                   "validatorClass");
-    digester.addBeanPropertySetter("faces-config/validator/description");
-    digester.addSetNext("faces-config/validator", "addValidator",
-                        ValidatorBean.class.getName());
-
-    // faces-config/validator/property
-    digester.addObjectCreate("faces-config/validator/property", PropertyBean.class);
-    digester.addBeanPropertySetter("faces-config/validator/property/property-name",
-                                   "propertyName");
-    digester.addBeanPropertySetter("faces-config/validator/property/property-class",
-                                   "propertyClass");
-    digester.addBeanPropertySetter("faces-config/validator/property/description");
-    digester.addBeanPropertySetter("faces-config/validator/property/default-value",
-                                   "defaultValue");
-    digester.addSetNext("faces-config/validator/property", "addProperty",
-                        PropertyBean.class.getName());
-
-
-    // faces-config/render-kit
-    digester.addObjectCreate("faces-config/render-kit", RenderKitBean.class);
-    digester.addBeanPropertySetter("faces-config/render-kit/render-kit-id",
-                                   "renderKitId");
-    digester.addSetNext("faces-config/render-kit", "addRenderKit",
-                        RenderKitBean.class.getName());
-
-    // faces-config/render-kit/renderer
-    digester.addObjectCreate("faces-config/render-kit/renderer", RendererBean.class);
-    digester.addBeanPropertySetter("faces-config/render-kit/renderer/description");
-    digester.addBeanPropertySetter("faces-config/render-kit/renderer/component-family",
-                                   "componentFamily");
-    digester.addBeanPropertySetter("faces-config/render-kit/renderer/renderer-type",
-                                   "rendererType");
-    digester.addBeanPropertySetter("faces-config/render-kit/renderer/renderer-class",
-                                   "rendererClass");
-    digester.addSetNext("faces-config/render-kit/renderer", "addRenderer",
-                        RendererBean.class.getName());
-
-
-    // TBD: JSR-276 metadata (ask Jeff Stephenson)
-
-
-    // Maven Faces Plugin
-    digester.setRuleNamespaceURI("http://myfaces.apache.org/maven-faces-plugin");
-
-    // faces-config/faces-config-extension/event
-    digester.addObjectCreate("faces-config/faces-config-extension/event", EventBean.class);
-    digester.addBeanPropertySetter("faces-config/faces-config-extension/event/description");
-    digester.addBeanPropertySetter("faces-config/faces-config-extension/event/event-type",
-                                   "eventType");
-    digester.addBeanPropertySetter("faces-config/faces-config-extension/event/event-class",
-                                   "eventClass");
-    digester.addBeanPropertySetter("faces-config/faces-config-extension/event/event-listener-class",
-                                   "eventListenerClass");
-    digester.addBeanPropertySetter("faces-config/faces-config-extension/event/event-source-interface",
-                                   "eventSourceInterface");
-    digester.addSetNext("faces-config/faces-config-extension/event", "addEvent",
-                        EventBean.class.getName());
-
-    // faces-config/converter/converter-extension
-    digester.addBeanPropertySetter("faces-config/converter/converter-extension/long-description",
-                                   "longDescription");
-    digester.addBeanPropertySetter("faces-config/converter/converter-extension/tag-class",
-                                   "tagClass");
-    digester.addBeanPropertySetter("faces-config/converter/converter-extension/tag-class-excluded",
-                                   "tagClassExcluded");
-    digester.addRule("faces-config/converter/converter-extension/tag-name",
-                     new BeanPropertySetterRule("tagName"));
-    digester.addCallMethod("faces-config/converter/converter-extension/tag-class-modifier",
-                           "parseTagClassModifier", 1);
-    digester.addCallParam("faces-config/converter/converter-extension/tag-class-modifier", 0);
-
-    // faces-config/converter/property/property-extension
-    digester.addBeanPropertySetter("faces-config/converter/property/property-extension/tag-attribute-excluded",
-                                   "tagAttributeExcluded");
-    digester.addBeanPropertySetter("faces-config/converter/property/property-extension/literal-only",
-                                   "literalOnly");
-
-    // faces-config/validator/validator-extension
-    digester.addBeanPropertySetter("faces-config/validator/validator-extension/long-description",
-                                   "longDescription");
-    digester.addBeanPropertySetter("faces-config/validator/validator-extension/tag-class",
-                                   "tagClass");
-    digester.addBeanPropertySetter("faces-config/validator/validator-extension/tag-class-excluded",
-                                   "tagClassExcluded");    
-    digester.addRule("faces-config/validator/validator-extension/tag-name",
-                     new BeanPropertySetterRule("tagName"));
-    digester.addCallMethod("faces-config/validator/validator-extension/tag-class-modifier",
-                           "parseTagClassModifier", 1);
-    digester.addCallParam("faces-config/validator/validator-extension/tag-class-modifier", 0);
-    
-    // faces-config/validator/property/property-extension
-    digester.addBeanPropertySetter("faces-config/validator/property/property-extension/tag-attribute-excluded",
-                                   "tagAttributeExcluded");
-    // faces-config/validator/property/property-extension/property-metada
-    digester.addBeanPropertySetter("faces-config/validator/property/property-extension/property-metadata/use-max-time",
-                                 "useMaxTime");
-
-    // faces-config/render-kit/renderer/renderer-extension
-    digester.addBeanPropertySetter("faces-config/render-kit/renderer/renderer-extension/component-type",
-                                   "componentType");
-    digester.addBeanPropertySetter("faces-config/render-kit/renderer/renderer-extension/renderer-superclass",
-                                   "rendererSuperclass");
-
-    return digester;
-  }
-
-  static public class ComponentIncludeFactory extends AbstractObjectCreationFactory
-  {
-    public Object createObject(
-      Attributes attributes) throws Exception
-    {
-      String href = attributes.getValue("href");
-      if (href == null)
-        throw new IllegalStateException("Missing href attribute");
-
-      URL master = (URL)digester.getRoot();
-      URL included = new URL(master, href);
-
-      Digester includedDigester = createEmptyDigester();
-      addComponentDigesterRules(includedDigester, false);
-      includedDigester.push(included);
-      includedDigester.push(digester.peek());
-
-      URLConnection conn = included.openConnection();
-      InputStream is = conn.getInputStream();
-      includedDigester.parse(is);
-      is.close();
-
-      // We don't really want the included object - but return it anyway
-      return included;
-    }
-  }
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/FacetBean.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/FacetBean.java
deleted file mode 100644
index e45b4e4..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/FacetBean.java
+++ /dev/null
@@ -1,93 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse;
-
-/**
- * FacetBean is a Java representation of the faces-config component or
- * renderer facet XML element.
- */
-public class FacetBean extends ObjectBean
-{
-  /**
-   * Sets the facet name for this facet.
-   *
-   * @param facetName  the facet name
-   */
-  public void setFacetName(
-    String facetName)
-  {
-    _facetName = facetName;
-  }
-
-  /**
-   * Returns the facet name for this facet.
-   *
-   * @return  the facet name
-   */
-  public String getFacetName()
-  {
-    return _facetName;
-  }
-
-  /**
-   * Sets the description of this property.
-   *
-   * @param description  the property description
-   */
-  public void setDescription(
-    String description)
-  {
-    _description = description;
-  }
-
-  /**
-   * Returns the description of this property.
-   *
-   * @return  the property description
-   */
-  public String getDescription()
-  {
-    return _description;
-  }
-
-  /**
-   * Sets the required flag of this facet.
-   *
-   * @param required  the facet required flag
-   */
-  public void setRequired(
-    boolean required)
-  {
-    _required = required;
-  }
-
-  /**
-   * Returns required flag of this facet.
-   *
-   * @return  the facet required flag
-   */
-  public boolean isRequired()
-  {
-    return _required;
-  }
-
-  private String  _description;
-  private String  _facetName;
-  private boolean _required;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/MethodSignatureBean.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/MethodSignatureBean.java
deleted file mode 100644
index b1121d1..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/MethodSignatureBean.java
+++ /dev/null
@@ -1,82 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse;
-
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * MethodSignatureBean is a Java representation of the faces-config component
- * property-extension method-signature XML element.
- */
-public class MethodSignatureBean extends ObjectBean
-{
-  /**
-   * Creates a new MethodSignatureBean.
-   */
-  public MethodSignatureBean()
-  {
-    _parameterTypes = new LinkedList();
-  }
-
-  /**
-   * Adds a new parameter type to this method signature.
-   *
-   * @param parameterType  the parameter type
-   */
-  public void addParameterType(
-    String parameterType)
-  {
-    _parameterTypes.add(parameterType);
-  }
-
-  /**
-   * Returns the list of parameter types as an array.
-   *
-   * @return  the parameter type list
-   */
-  public String[] getParameterTypes()
-  {
-    return (String[])_parameterTypes.toArray(new String[0]);
-  }
-
-  /**
-   * Sets the return type of this method signature.
-   *
-   * @param returnType  the method signature return type
-   */
-  public void setReturnType(
-    String returnType)
-  {
-    _returnType = returnType;
-  }
-
-  /**
-   * Returns the return type of this method signature.
-   *
-   * @return  the method signature return type
-   */
-  public String getReturnType()
-  {
-    return _returnType;
-  }
-
-  private String _returnType;
-  private List   _parameterTypes;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/ObjectBean.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/ObjectBean.java
deleted file mode 100644
index a6d33ab..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/ObjectBean.java
+++ /dev/null
@@ -1,80 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse;
-
-/**
- * ObjectBean is the base class for all parsed beans.
- */
-public class ObjectBean
-{
-  /**
-   * Creates a new ObjectBean.
-   */
-  public ObjectBean()
-  {
-  }
-
-  /**
-   * Returns true if this faces config document has been modified since
-   * the specified timestamp.
-   *
-   * @param timestamp  the timestamp in UTC millis
-   *
-   * @return true  if this faces config document has been modified,
-   *         otherwise false
-   */
-  public boolean isModifiedSince(
-    long timestamp)
-  {
-    return (_lastModified > timestamp);
-  }
-
-  protected FacesConfigBean getOwner()
-  {
-    return _owner;
-  }
-
-  /**
-   * Attaches the object.
-   *
-   * @param owner  the faces config owner
-   */
-  protected void attach(
-    FacesConfigBean owner)
-  {
-    _owner = owner;
-    ObjectBean object = owner;
-    touch(object._lastModified);
-  }
-
-  /**
-   * Sets the last modified timestamp for the parsed faces config document
-   * if it is newer than the existing last modified timestamp.
-   *
-   * @param lastModified  the last modified time in UTC millis
-   */
-  void touch(
-    long lastModified)
-  {
-    _lastModified = Math.max(_lastModified, lastModified);
-  }
-
-  private long _lastModified;
-  private FacesConfigBean _owner;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/PropertyBean.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/PropertyBean.java
deleted file mode 100644
index 41302fc..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/PropertyBean.java
+++ /dev/null
@@ -1,504 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse;
-
-/**
- * PropertyBean is a Java representation of the faces-config component property
- * XML element.
- */
-public class PropertyBean extends AttributeBean
-{
-    public void setUseMaxTime(boolean _useMaxTime) 
-    {
-      this._useMaxTime = _useMaxTime;
-    }
-    
-    public boolean getUseMaxTime() 
-    {
-      return _useMaxTime;
-    }
-
-  /**
-   * Sets the name of this property.
-   *
-   * @param propertyName  the property name
-   */
-  public void setPropertyName(
-    String propertyName)
-  {
-    setAttributeName(propertyName);
-  }
-
-  /**
-   * Returns the name of this property.
-   *
-   * @return  the property name
-   */
-  public String getPropertyName()
-  {
-    return getAttributeName();
-  }
-
-  /**
-   * Sets the property class for this property.
-   *
-   * @param propertyClass  the property class
-   */
-  public void setPropertyClass(
-    String propertyClass)
-  {
-    setAttributeClass(propertyClass);
-  }
-
-  /**
-   * Returns the property class for this property.
-   *
-   * @return  the property class
-   */
-  public String getPropertyClass()
-  {
-    return getAttributeClass();
-  }
-
-  /**
-   * Returns the array of parameterized types for this property
-   * if it uses generics.
-   *
-   * @return the array of parameterized types for this property
-   */
-  public String[] getPropertyClassParameters()
-  {
-    return getAttributeClassParameters();
-  }
-
-  /**
-   * Sets the possible values for this property.
-   *
-   * @param propertyValues  the property values
-   */
-  public void setPropertyValues(
-    String[] propertyValues)
-  {
-    _propertyValues = propertyValues;
-  }
-
-  /**
-   * Returns possible values for this property.
-   *
-   * @return  the property values
-   */
-  public String[] getPropertyValues()
-  {
-    return _propertyValues;
-  }
-
-  /**
-   * Sets the stateHolder flag of this property.
-   *
-   * @param stateHolder  the property stateHolder flag
-   */
-  public void setStateHolder(
-    boolean stateHolder)
-  {
-    _stateHolder = stateHolder;
-  }
-
-  /**
-   * Returns stateHolder flag of this property.
-   *
-   * @return  the property stateHolder flag
-   */
-  public boolean isStateHolder()
-  {
-    return _stateHolder;
-  }
-
-  /**
-   * Sets the transient flag of this property.
-   *
-   * @param transient  the property transient flag
-   */
-  public void setTransient(
-    boolean transient_)
-  {
-    _transient = transient_;
-  }
-
-  /**
-   * Returns transient flag of this property.
-   *
-   * @return  the property transient flag
-   */
-  public boolean isTransient()
-  {
-    return _transient;
-  }
-
-
-  /**
-   * Sets the list flag of this property.
-   *
-   * @param list  the property list flag
-   */
-  public void setList(
-    boolean list_)
-  {
-    _list = list_;
-  }
-
-  /**
-   * Returns list flag of this property.
-   *
-   * @return  the property list flag
-   */
-  public boolean isList()
-  {
-    return _list;
-  }
-
-  /**
-   * Sets the required flag of this property.
-   *
-   * @param required  the property required flag
-   */
-  public void setRequired(
-    boolean required)
-  {
-    _required = required;
-  }
-
-  /**
-   * Returns required flag of this property.
-   *
-   * @return  the property required flag
-   */
-  public boolean isRequired()
-  {
-    return _required;
-  }
-
-  /**
-   * Sets the literalOnly flag of this property.
-   *
-   * @param literalOnly  the property literalOnly flag
-   */
-  public void setLiteralOnly(
-    boolean literalOnly)
-  {
-    _literalOnly = literalOnly;
-  }
-
-  /**
-   * Returns literalOnly flag of this property.
-   *
-   * @return  the property literalOnly flag
-   */
-  public boolean isLiteralOnly()
-  {
-    return _literalOnly;
-  }
-
-  /**
-   * Sets the alias of this property.
-   *
-   * @param aliasOf  the property alias
-   */
-  public void setAliasOf(
-    String aliasOf)
-  {
-    _aliasOf = aliasOf;
-  }
-
-  /**
-   * Returns the alias of this property.
-   *
-   * @return  the property alias
-   */
-  public String getAliasOf()
-  {
-    return _aliasOf;
-  }
-
-  /**
-   * Sets the unsupported agents for this property.
-   *
-   * @param unsupportedAgents  the unsupported agents
-   */
-  public void setUnsupportedAgents(
-    String[] unsupportedAgents)
-  {
-    if (unsupportedAgents == null)
-      throw new NullPointerException("unsupportedAgents");
-
-    _unsupportedAgents = unsupportedAgents;
-  }
-
-  /**
-   * Returns unsupported agents for this property.
-   *
-   * @return  the unsupported agents
-   */
-  public String[] getUnsupportedAgents()
-  {
-    return _unsupportedAgents;
-  }
-
-  /**
-   * Sets the unsupported RenderKits for this property.
-   *
-   * @param unsupportedRenderKits  the unsupported RenderKits
-   */
-  public void setUnsupportedRenderKits(
-    String[] unsupportedRenderKits)
-  {
-    if (unsupportedRenderKits == null)
-      throw new NullPointerException("unsupportedRenderKits");
-
-    _unsupportedRenderKits = unsupportedRenderKits;
-  }
-
-  /**
-   * Returns unsupported RenderKits for this property.
-   *
-   * @return  the unsupported RenderKits
-   */
-  public String[] getUnsupportedRenderKits()
-  {
-    return _unsupportedRenderKits;
-  }
-
-  /**
-   * Sets the tag attribute excluded flag for this property.
-   *
-   * @param excluded  true,  if the tag attribute should be excluded;
-   *                  false, otherwise
-   */
-  public void setTagAttributeExcluded(
-    boolean excluded)
-  {
-    _tagAttributeExcluded = excluded;
-  }
-
-  /**
-   * Returns the tag attribute excluded flag for this property.
-   *
-   * @return true,  if the tag attribute should be excluded;
-   *         false, otherwise
-   */
-  public boolean isTagAttributeExcluded()
-  {
-    return _tagAttributeExcluded;
-  }
-
-  /**
-   * Returns true if the property is an enumerated Java type.
-   */
-  public boolean isEnum()
-  {
-    return _enum;
-  }
-
-  /**
-   * Returns true if the property is an enumerated Java type.
-   */
-  public void setEnum(boolean isEnum)
-  {
-    _enum = isEnum;
-  }
-
-  /**
-   * Returns true if this property is a method binding.
-   *
-   * @return true  if this property is a method binding,
-   *         otherwise false
-   */
-  public boolean isMethodBinding()
-  {
-    return ("javax.faces.el.MethodBinding".equals(getPropertyClass()));
-  }
-
-
-  /**
-   * Returns true if this property is a method binding.
-   *
-   * @return true  if this property is a method binding,
-   *         otherwise false
-   */
-  public boolean isMethodExpression()
-  {
-    return ("javax.el.MethodExpression".equals(getPropertyClass()));
-  }
-
-  /**
-   * Parses the possible values for this property into a String array
-   * using space as the separator between values.
-   *
-   * @param propertyValues  the property values
-   */
-  public void parsePropertyValues(
-    String propertyValues)
-  {
-    setPropertyValues(propertyValues.split(" "));
-  }
-
-  /**
-   * Parses the unsupported agents for this property into a String array
-   * using space as the separator between values.
-   *
-   * @param unsupportedAgents  the unsupported agents
-   */
-  public void parseUnsupportedAgents(
-    String unsupportedAgents)
-  {
-    setUnsupportedAgents(unsupportedAgents.split(" "));
-  }
-
-  /**
-   * Parses the unsupported RenderKits for this property into a String array
-   * using space as the separator between values.
-   *
-   * @param unsupportedRenderKits  the unsupported RenderKits
-   */
-  public void parseUnsupportedRenderKits(
-    String unsupportedRenderKits)
-  {
-    setUnsupportedRenderKits(unsupportedRenderKits.split(" "));
-  }
-
-  /**
-   * Sets the JSP name of this property.
-   *
-   * @param jspPropertyName  the JSP property name
-   */
-  public void setJspPropertyName(
-    String jspPropertyName)
-  {
-    _jspPropertyName = jspPropertyName;
-  }
-
-  /**
-   * Returns the JSP name of this property.
-   *
-   * @return  the JSP property name
-   */
-  public String getJspPropertyName()
-  {
-    if (_jspPropertyName == null)
-      return getPropertyName();
-
-    return _jspPropertyName;
-  }
-
-  /**
-   * Sets the field name of this property, when not generating Trinidad components
-   *
-   * @param fieldPropertyName  the field property name
-   */
-  public void setFieldPropertyName(
-    String fieldPropertyName)
-  {
-    _fieldPropertyName = fieldPropertyName;
-  }
-
-  /**
-   * Returns the field name of this property, when not generating Trinidad components
-   *
-   * @return  the field property name
-   */
-  public String getFieldPropertyName()
-  {
-    if (_fieldPropertyName == null)
-      return "_"+getPropertyName();
-
-    return _fieldPropertyName;
-  }
-
-  public void setIsSetMethod(boolean _isSetMethod)
-  {
-    this._isSetMethod = _isSetMethod;
-  }
-
-  public boolean isIsSetMethod()
-  {
-    return _isSetMethod;
-  }
-
-  public void setIsSetMethodScope(String _isSetMethodScope)
-  {
-    this._isSetMethodScope = _isSetMethodScope;
-  }
-
-  public String getIsSetMethodScope()
-  {
-    return _isSetMethodScope;
-  }
-
-  public void setIsGetLocalMethod(boolean _isGetLocalMethod)
-  {
-    this._isGetLocalMethod = _isGetLocalMethod;
-  }
-
-  public boolean isIsGetLocalMethod()
-  {
-    return _isGetLocalMethod;   
-  }
-
-  public void setIsGetLocalMethodScope(String _isGetLocalMethodScope)
-  {
-    this._isGetLocalMethodScope = _isGetLocalMethodScope;
-  }
-
-  public String getIsGetLocalMethodScope()
-  {
-    return _isGetLocalMethodScope;
-  }
-
-  public void setRtexprvalue(boolean _rtexprvalue)
-  {
-    this._rtexprvalue = _rtexprvalue;
-  }
-
-  public boolean isRtexprvalue()
-  {
-    return _rtexprvalue;
-  }
- 
-  private boolean _rtexprvalue;
-  private String _isGetLocalMethodScope;
-  private boolean _isGetLocalMethod;
-  private String _isSetMethodScope;
-  private boolean _isSetMethod;
-  private String  _aliasOf;
-  private String  _jspPropertyName;
-  private String  _fieldPropertyName;
-  private boolean _required;
-  private boolean _literalOnly;
-  private boolean _stateHolder;
-  private boolean _transient;
-  private boolean _list;
-  private boolean _tagAttributeExcluded;
-  private boolean _enum;
-  private boolean _useMaxTime;
-  private String[] _propertyValues;
-  private String[] _unsupportedAgents = _EMPTY_ARRAY;
-  private String[] _unsupportedRenderKits = _EMPTY_ARRAY;
-
-  static private String[] _EMPTY_ARRAY = new String[0];
-
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/RenderKitBean.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/RenderKitBean.java
deleted file mode 100644
index d546661..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/RenderKitBean.java
+++ /dev/null
@@ -1,144 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
-
-/**
- * RenderKitBean is a Java representation of the faces-config render-kit
- * XML element.
- */
-public class RenderKitBean extends ObjectBean
-{
-  /**
-   * Creates a new RenderKitBean.
-   */
-  public RenderKitBean()
-  {
-    _renderers = new TreeMap();
-  }
-
-  /**
-   * Sets the render kit id for this component.
-   *
-   * @param renderKitId  the render kit id
-   */
-  public void setRenderKitId(
-    String renderKitId)
-  {
-    _renderKitId = renderKitId;
-  }
-
-  /**
-   * Returns the render kit id type for this component.
-   *
-   * @return  the render kit id
-   */
-  public String getRenderKitId()
-  {
-    return _renderKitId;
-  }
-
-  /**
-   * Adds a renderer to this render kit.
-   *
-   * @param renderer  the renderer to add
-   */
-  public void addRenderer(
-    RendererBean renderer)
-  {
-    String componentFamily = renderer.getComponentFamily();
-    String rendererType = renderer.getRendererType();
-    String compositeKey = componentFamily + "|" + rendererType;
-    _renderers.put(compositeKey, renderer);
-
-    FacesConfigBean owner = getOwner();
-    if (owner != null)
-    {
-      renderer.attach(owner);
-    }
-  }
-
-  /**
-   * Returns the renderer for this component family and renderer type.
-   *
-   * @param componentFamily  the component family
-   * @param rendererType     the renderer type
-   */
-  public RendererBean findRenderer(
-    String componentFamily,
-    String rendererType)
-  {
-    String compositeKey = componentFamily + "|" + rendererType;
-    return (RendererBean) _renderers.get(compositeKey);
-  }
-
-  /**
-   * Returns true if this render kit has any renderers.
-   *
-   * @return  true   if this render kit has any renderers,
-   *          false  otherwise
-   */
-  public boolean hasRenderers()
-  {
-    return !_renderers.isEmpty();
-  }
-
-  /**
-   * Returns an iterator for all renderers in this render kit.
-   *
-   * @return  the renderer iterator
-   */
-  public Iterator renderers()
-  {
-    return _renderers.values().iterator();
-  }
-
-  /**
-   * Attaches the component and all event references.
-   *
-   * @param owner  the faces config owner
-   */
-  protected void attach(
-    FacesConfigBean owner)
-  {
-    super.attach(owner);
-    Iterator renderers = renderers();
-    while (renderers.hasNext())
-    {
-      RendererBean renderer = (RendererBean)renderers.next();
-      renderer.attach(owner);
-    }
-  }
-
-  void addAllRenderers(
-    RenderKitBean renderKit)
-  {
-    for (Iterator i = renderKit._renderers.values().iterator(); i.hasNext();)
-    {
-      // use addRenderer to establish owner
-      addRenderer((RendererBean)i.next());
-    }
-  }
-
-  private String  _renderKitId = "";
-  private Map     _renderers;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/RendererBean.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/RendererBean.java
deleted file mode 100644
index d6b5ee7..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/RendererBean.java
+++ /dev/null
@@ -1,443 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.CompoundIterator;
-
-/**
- * RenderKitBean is a Java representation of the faces-config render-kit
- * XML element.
- */
-public class RendererBean extends ObjectBean
-{
-  /**
-   * Creates a new RendererBean.
-   */
-  public RendererBean()
-  {
-    _attributes = new TreeMap();
-    _facets = new TreeMap();
-  }
-
-  /**
-   * Sets the component family for this component.
-   *
-   * @param componentFamily  the component family
-   */
-  public void setComponentFamily(
-    String componentFamily)
-  {
-    _componentFamily = componentFamily;
-  }
-
-  /**
-   * Returns the component family for this component.
-   *
-   * @return  the component family
-   */
-  public String getComponentFamily()
-  {
-    return _componentFamily;
-  }
-
-  /**
-   * Sets the renderer type for this component.
-   *
-   * @param rendererType  the renderer type
-   */
-  public void setRendererType(
-    String rendererType)
-  {
-    _rendererType = rendererType;
-  }
-
-  /**
-   * Returns the renderer type for this component.
-   *
-   * @return  the renderer type
-   */
-  public String getRendererType()
-  {
-    return _rendererType;
-  }
-
-  /**
-   * Sets the renderer class for this renderer.
-   *
-   * @param rendererClass  the renderer class
-   */
-  public void setRendererClass(
-    String rendererClass)
-  {
-    _rendererClass = rendererClass;
-  }
-
-  /**
-   * Returns the renderer class for this renderer.
-   *
-   * @return  the renderer class
-   */
-  public String getRendererClass()
-  {
-    return _rendererClass;
-  }
-
-  /**
-   * Sets the description of this attribute.
-   *
-   * @param description  the attribute description
-   */
-  public void setDescription(
-    String description)
-  {
-    _description = description;
-  }
-
-  /**
-   * Returns the description of this attribute.
-   *
-   * @return  the attribute description
-   */
-  public String getDescription()
-  {
-    return _description;
-  }
-
-  /**
-   * Sets the component type for this component.
-   *
-   * @param componentType  the component type
-   */
-  public void setComponentType(
-    String componentType)
-  {
-    _componentType = componentType;
-  }
-
-  /**
-   * Returns the component type for this component.
-   *
-   * @return  the component type
-   */
-  public String getComponentType()
-  {
-    return _componentType;
-  }
-
-  /**
-   * Sets the renderer superclass for this renderer.
-   *
-   * @param rendererSuperclass  the renderer superclass
-   */
-  public void setRendererSuperclass(
-    String rendererSuperclass)
-  {
-    _rendererSuperclass = rendererSuperclass;
-  }
-
-  /**
-   * Returns the renderer superclass for this component.
-   *
-   * @return  the renderer superclass
-   */
-  public String getRendererSuperclass()
-  {
-    return _rendererSuperclass;
-  }
-
-  /**
-   * Finds the renderer-specific component class for this renderer.
-   *
-   * @return  the renderer-specifc component class
-   */
-  public String findComponentClass()
-  {
-    ComponentBean component = resolveComponentType();
-    return (component != null) ? component.getComponentClass()
-                               : "org.apache.myfaces.trinidad.component.UIXComponent";
-  }
-
-  /**
-   * Finds the behavioral component class for this renderer.
-   *
-   * @return  the behavioral component class
-   */
-  public String findComponentFamilyClass()
-  {
-    ComponentBean component = resolveComponentType();
-    ComponentBean behavioral = (component != null)
-                                  ? component.findBehavioralComponent()
-                                  : null;
-    return (behavioral != null) ? behavioral.getComponentClass()
-                                : "org.apache.myfaces.trinidad.component.UIXComponent";
-  }
-
-  /**
-   * Adds a attribute to this component.
-   *
-   * @param attribute  the attribute to add
-   */
-  public void addAttribute(
-    AttributeBean attribute)
-  {
-    _attributes.put(attribute.getAttributeName(), attribute);
-  }
-
-  /**
-   * Returns the attribute for this attribute name.
-   *
-   * @param attributeName  the attribute name to find
-   */
-  public AttributeBean findAttribute(
-    String attributeName)
-  {
-    AttributeBean attribute = (AttributeBean)_attributes.get(attributeName);
-
-    if (attribute == null)
-    {
-      ComponentBean component = resolveComponentType();
-      if (component != null)
-        attribute = component.findProperty(attributeName);
-    }
-
-    return attribute;
-  }
-
-  /**
-   * Returns true if this component has any attributes.
-   *
-   * @return  true   if this component has any attributes,
-   *          false  otherwise
-   */
-  public boolean hasAttributes()
-  {
-    boolean hasAttributes = !_attributes.isEmpty();
-
-    if (!hasAttributes)
-    {
-      ComponentBean component = resolveComponentType();
-      if (component != null)
-        hasAttributes |= component.hasProperties();
-    }
-
-    return hasAttributes;
-  }
-
-  /**
-   * Returns true if this component or any component supertype
-   * has any attributes.
-   *
-   * @return  true   if this component or any supertype has any attributes,
-   *          false  otherwise
-   */
-  public boolean hasAttributes(
-    boolean flatten)
-  {
-    boolean hasAttributes = hasAttributes();
-
-    if (!hasAttributes && flatten)
-    {
-      ComponentBean component = resolveComponentType();
-      if (component != null)
-      {
-        ComponentBean parent = component.resolveSupertype();
-        if (parent != null)
-          hasAttributes |= parent.hasProperties(true);
-      }
-    }
-
-    return hasAttributes;
-  }
-
-  /**
-   * Returns an iterator for all attributes on this component only.
-   *
-   * @return  the attribute iterator
-   */
-  public Iterator attributes()
-  {
-    Iterator attributes = _attributes.values().iterator();
-
-    ComponentBean component = resolveComponentType();
-    if (component != null)
-        attributes = new CompoundIterator(attributes, component.properties());
-
-    return attributes;
-  }
-
-  /**
-   * Returns an iterator for attributes on this component.
-   *
-   * @param flatten  true   if the iterator should be a combined list of
-   *                        attributes of this component and its supertype,
-   *                 false  otherwise
-   *
-   * @return  the attribute iterator
-   */
-  public Iterator attributes(
-    boolean flatten)
-  {
-    Iterator attributes = attributes();
-    if (flatten)
-    {
-      ComponentBean component = resolveComponentType();
-      if (component != null)
-      {
-        ComponentBean parent = component.resolveSupertype();
-        if (parent != null)
-          attributes = new CompoundIterator(attributes, parent.properties(true));
-      }
-    }
-    return attributes;
-  }
-
-  /**
-   * Adds a facet to this component.
-   *
-   * @param facet  the facet to add
-   */
-  public void addFacet(
-    FacetBean facet)
-  {
-    _facets.put(facet.getFacetName(), facet);
-  }
-
-  /**
-   * Returns the facet for this facet name.
-   *
-   * @param facetName  the facet name to find
-   */
-  public FacetBean findFacet(
-    String facetName)
-  {
-    return (FacetBean)_facets.get(facetName);
-  }
-
-  /**
-   * Returns true if this component has any facets.
-   *
-   * @return  true   if this component has any facets,
-   *          false  otherwise
-   */
-  public boolean hasFacets()
-  {
-    boolean hasFacets = !_facets.isEmpty();
-
-    ComponentBean component = resolveComponentType();
-    if (component != null)
-      hasFacets |= component.hasFacets();
-
-    return hasFacets;
-  }
-
-  /**
-   * Returns true if this component or any component supertype
-   * has any facets.
-   *
-   * @return  true   if this component or any supertype has any facets,
-   *          false  otherwise
-   */
-  public boolean hasFacets(
-    boolean flatten)
-  {
-    boolean hasFacets = hasFacets();
-
-    if (!hasFacets && flatten)
-    {
-      ComponentBean component = resolveComponentType();
-      if (component != null)
-      {
-        ComponentBean parent = component.resolveSupertype();
-        if (parent != null)
-          hasFacets |= parent.hasFacets(true);
-      }
-    }
-
-    return hasFacets;
-  }
-
-  /**
-   * Returns an iterator for all facets on this component only.
-   *
-   * @return  the facet iterator
-   */
-  public Iterator facets()
-  {
-    Iterator facets = _facets.values().iterator();
-
-    ComponentBean component = resolveComponentType();
-    if (component != null)
-        facets = new CompoundIterator(facets, component.facets());
-
-    return facets;
-  }
-
-  /**
-   * Returns an iterator for facets on this component.
-   *
-  * @param flatten  true   if the iterator should be a combined list of
-  *                        facets of this component and its supertype,
-  *                 false  otherwise
-  *
-  * @return  the facet iterator
-  */
-  public Iterator facets(
-    boolean flatten)
-  {
-    Iterator facets = facets();
-    if (flatten)
-    {
-      ComponentBean component = resolveComponentType();
-      if (component != null)
-      {
-        ComponentBean parent = component.resolveSupertype();
-        if (parent != null)
-          facets = new CompoundIterator(facets, parent.facets(true));
-      }
-    }
-    return facets;
-  }
-
-  /**
-   * Returns the component type instance.
-   *
-   * @return  the component type instance
-   */
-  public ComponentBean resolveComponentType()
-  {
-    if (_componentType == null)
-      return null;
-
-    FacesConfigBean owner = getOwner();
-    return (owner != null) ? owner.findComponent(_componentType) : null;
-  }
-
-  private String  _description;
-  private String  _componentFamily;
-  private String  _rendererType;
-  private String  _rendererClass;
-  private String  _rendererSuperclass;
-  private String  _componentType;
-  private Map     _attributes;
-  private Map     _facets;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/ValidatorBean.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/ValidatorBean.java
deleted file mode 100644
index 7d4a8ba..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/ValidatorBean.java
+++ /dev/null
@@ -1,159 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse;
-
-import java.lang.reflect.Modifier;
-import java.util.logging.Logger;
-
-/**
- * ValidatorBean is a Java representation of the faces-config validator
- * XML element.
- */
-public class ValidatorBean extends AbstractTagBean {
-
-  /**
-   * Sets the validator identifer for this component.
-   *
-   * @param validatorId  validator identifer
-   */
-  public void setValidatorId(
-    String validatorId)
-  {
-    _validatorId = validatorId;
-  }
-
-  /**
-   * Returns true if the validator identifier is specified, otherwise false.
-   *
-   * @return  true if the validator identifier is specified,
-   *          otherwise false.
-   */
-  public boolean hasValidatorId()
-  {
-    return (_validatorId != null);
-  }
-
-  /**
-   * Returns the validator identifier for this component.
-   *
-   * @return  the validator identifier
-   */
-  public String getValidatorId()
-  {
-    return _validatorId;
-  }
-
-  /**
-   * Sets the validator class for this component.
-   *
-   * @param validatorClass  the validator class
-   */
-  public void setValidatorClass(
-    String validatorClass)
-  {
-    _validatorClass = validatorClass;
-  }
-
-  /**
-   * Returns the validator class for this component.
-   *
-   * @return  the validator class
-   */
-  public String getValidatorClass()
-  {
-    return _validatorClass;
-  }
-
-  /**
-   * Sets the validator super class for this component.
-   *
-   * @param validatorSuperClass  the validator super class
-   */
-  public void setValidatorSuperClass(
-    String validatorSuperClass)
-  {
-    _validatorSuperClass = validatorSuperClass;
-  }
-
-  /**
-   * Returns the validator super class for this component.
-   *
-   * @return  the validator super class
-   */
-  public String getValidatorSuperClass()
-  {
-    return _validatorSuperClass;
-  }
-
-  /**
-   * Adds a Java Language class modifier to the validator class.
-   *
-   * @param modifier  the modifier to be added
-   */
-  public void addValidatorClassModifier(
-    int modifier)
-  {
-    _validatorClassModifiers |= modifier;
-  }
-
-  /**
-   * Returns the Java Language class modifiers for the validator class.
-   * By default, these modifiers include Modifier.PUBLIC.
-   *
-   * @return  the Java Language class modifiers for the validator class
-   */
-  public int getValidatorClassModifiers()
-  {
-    int modifiers = _validatorClassModifiers;
-
-    if (!Modifier.isPrivate(modifiers) &&
-        !Modifier.isProtected(modifiers) &&
-        !Modifier.isPublic(modifiers))
-    {
-      modifiers |= Modifier.PUBLIC;
-    }
-
-    return modifiers;
-  }
-
-  public void parseValidatorClassModifier(
-    String modifier)
-  {
-    addValidatorClassModifier(_parseModifier(modifier));
-  }
-  
-  public void setTagClassExcluded(boolean tagClassExcluded)
-  {
-    _tagClassExcluded = tagClassExcluded;
-  }
-
-  public boolean isTagClassExcluded()
-  {
-    return _tagClassExcluded;
-  }
-
-  private String  _validatorId;
-  private String  _validatorClass;
-  private String  _validatorSuperClass;
-  private int     _validatorClassModifiers;
-  private boolean _tagClassExcluded;
-
-
-  static private final Logger _LOG = Logger.getLogger(ValidatorBean.class.getName());
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/converters/QNameConverter.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/converters/QNameConverter.java
deleted file mode 100644
index ecb9a42..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/converters/QNameConverter.java
+++ /dev/null
@@ -1,53 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse.converters;
-
-import javax.xml.namespace.QName;
-
-import org.apache.commons.beanutils.ConversionException;
-import org.apache.commons.beanutils.ConvertUtils;
-import org.apache.commons.beanutils.Converter;
-
-public final class QNameConverter implements Converter
-{
-  public Object convert(
-    Class  type,
-    Object value)
-  {
-    if (value == null)
-      throw new ConversionException("Missing value");
-
-    if (value instanceof QName)
-      return value;
-
-    try
-    {
-      return QName.valueOf(value.toString());
-    }
-    catch (Exception e)
-    {
-      throw new ConversionException(e);
-    }
-  }
-
-  static public void register()
-  {
-    ConvertUtils.register(new QNameConverter(), QName.class);
-  }
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/rules/BeanPropertySetterRule.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/rules/BeanPropertySetterRule.java
deleted file mode 100644
index e303b17..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/parse/rules/BeanPropertySetterRule.java
+++ /dev/null
@@ -1,87 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.parse.rules;
-
-import java.beans.PropertyDescriptor;
-
-import javax.xml.namespace.QName;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.converters.QNameConverter;
-import org.apache.commons.beanutils.BeanUtils;
-import org.apache.commons.beanutils.PropertyUtils;
-
-
-/**
- * Extends Apache Commons Digester BeanPropertySetterRule to add QName support.
- *
- * A QName conveter is not sufficient because it requires contextual
- * knowledge of the current prefix-to-namespace mappings.
- */
-public class BeanPropertySetterRule
-       extends org.apache.commons.digester.BeanPropertySetterRule
-{
-  public BeanPropertySetterRule(
-    String propertyName)
-  {
-    super(propertyName);
-  }
-
-  public void end(
-    String namespace,
-    String name) throws Exception
-  {
-    Object top = digester.peek();
-
-    PropertyDescriptor descriptor =
-          PropertyUtils.getPropertyDescriptor(top, propertyName);
-
-    if (descriptor == null)
-    {
-      throw new NoSuchMethodException("Missing bean property \"" +
-                                      propertyName + "\"");
-    }
-
-    Class propertyType = descriptor.getPropertyType();
-
-    if (QName.class.equals(propertyType))
-    {
-      int colon = bodyText.indexOf(':');
-      if (colon != -1)
-      {
-        String namespaceURI = digester.findNamespaceURI(bodyText.substring(0, colon));
-        bodyText = "{" + namespaceURI + "}" + bodyText.substring(colon + 1);
-      }
-      else if (bodyText.indexOf('{') == -1)
-      {
-        String namespaceURI = digester.findNamespaceURI("");
-        bodyText = "{" + namespaceURI + "}" + bodyText.substring(colon + 1);
-      }
-      BeanUtils.setProperty(top, propertyName, bodyText);
-    }
-    else
-    {
-      super.end(namespace, name);
-    }
-  }
-
-  static
-  {
-    QNameConverter.register();
-  }
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/AttributeFilter.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/AttributeFilter.java
deleted file mode 100644
index 87acbb7..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/AttributeFilter.java
+++ /dev/null
@@ -1,33 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.util;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.AttributeBean;
-
-abstract public class AttributeFilter implements Filter
-{
-  final public boolean accept(
-    Object obj)
-  {
-    return accept((AttributeBean)obj);
-  }
-
-  abstract protected boolean accept(
-    AttributeBean attribute);
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/ComponentFilter.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/ComponentFilter.java
deleted file mode 100644
index a4e47e2..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/ComponentFilter.java
+++ /dev/null
@@ -1,33 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.util;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ComponentBean;
-
-abstract public class ComponentFilter implements Filter
-{
-  final public boolean accept(
-    Object obj)
-  {
-    return accept((ComponentBean)obj);
-  }
-
-  abstract protected boolean accept(
-    ComponentBean component);
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/CompoundIterator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/CompoundIterator.java
deleted file mode 100644
index 8d6dc2c..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/CompoundIterator.java
+++ /dev/null
@@ -1,80 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.util;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * CompoundIterator consumes the initial iterator before
- * observing the next iterator.
- */
-public class CompoundIterator implements Iterator
-{
-  public CompoundIterator(
-    Iterator primary,
-    Iterator secondary)
-  {
-    this(new Iterator[] {primary, secondary});
-  }
-
-  public CompoundIterator(
-    Iterator[] iterators)
-  {
-    _iterators = iterators;
-    _index = 0;
-    _advance();
-  }
-
-  public boolean hasNext()
-  {
-    return (_next != null);
-  }
-
-  public Object next()
-  {
-    if (_next == null)
-      throw new NoSuchElementException();
-
-    Object obj = _next;
-    _advance();
-    return obj;
-  }
-
-  public void remove()
-  {
-    throw new UnsupportedOperationException();
-  }
-
-  private void _advance()
-  {
-    Iterator current = _iterators[_index];
-    if (current != null && !current.hasNext())
-    {
-      _index ++;
-      current = (_index < _iterators.length) ? _iterators[_index] : null;
-    }
-
-    _next = (current != null && current.hasNext()) ? current.next() : null;
-  }
-
-  private Object _next;
-  private Iterator[] _iterators;
-  private int _index;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/ConverterFilter.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/ConverterFilter.java
deleted file mode 100644
index 6ec3850..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/ConverterFilter.java
+++ /dev/null
@@ -1,33 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.util;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ConverterBean;
-
-abstract public class ConverterFilter implements Filter
-{
-  final public boolean accept(
-    Object obj)
-  {
-    return accept((ConverterBean)obj);
-  }
-
-  abstract protected boolean accept(
-    ConverterBean converter);
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/FacetFilter.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/FacetFilter.java
deleted file mode 100644
index e6f5f2d..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/FacetFilter.java
+++ /dev/null
@@ -1,33 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.util;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.FacetBean;
-
-abstract public class FacetFilter implements Filter
-{
-  final public boolean accept(
-    Object obj)
-  {
-    return accept((FacetBean)obj);
-  }
-
-  abstract protected boolean accept(
-    FacetBean facet);
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/Filter.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/Filter.java
deleted file mode 100644
index a383bb6..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/Filter.java
+++ /dev/null
@@ -1,25 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.util;
-
-public interface Filter
-{
-  abstract public boolean accept(
-    Object obj);
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/FilteredIterator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/FilteredIterator.java
deleted file mode 100644
index cd60c76..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/FilteredIterator.java
+++ /dev/null
@@ -1,73 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.util;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-public class FilteredIterator implements Iterator
-{
-  public FilteredIterator(
-    Iterator iter,
-    Filter   filter)
-  {
-    _iter = iter;
-    _filter = filter;
-    _advance();
-  }
-
-  public boolean hasNext()
-  {
-    return (_next != null);
-  }
-
-  public Object next()
-  {
-    if (_next == null)
-      throw new NoSuchElementException();
-
-    Object obj = _next;
-    _advance();
-    return obj;
-  }
-
-  public void remove()
-  {
-    throw new UnsupportedOperationException();
-  }
-
-  private void _advance()
-  {
-    while (_iter.hasNext())
-    {
-      Object obj = _iter.next();
-      if (_filter.accept(obj))
-      {
-        _next = obj;
-        return;
-      }
-    }
-
-    _next = null;
-  }
-
-  private final Iterator _iter;
-  private final Filter _filter;
-  private Object _next;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/PropertyFilter.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/PropertyFilter.java
deleted file mode 100644
index 36fc593..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/PropertyFilter.java
+++ /dev/null
@@ -1,33 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.util;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-
-abstract public class PropertyFilter implements Filter
-{
-  final public boolean accept(
-    Object obj)
-  {
-    return accept((PropertyBean)obj);
-  }
-
-  abstract protected boolean accept(
-    PropertyBean property);
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/RendererFilter.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/RendererFilter.java
deleted file mode 100644
index 903d4eb..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/RendererFilter.java
+++ /dev/null
@@ -1,33 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.util;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.RendererBean;
-
-abstract public class RendererFilter implements Filter
-{
-  final public boolean accept(
-    Object obj)
-  {
-    return accept((RendererBean)obj);
-  }
-
-  abstract protected boolean accept(
-    RendererBean renderer);
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/SortedIterator.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/SortedIterator.java
deleted file mode 100644
index 4ee8cd1..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/SortedIterator.java
+++ /dev/null
@@ -1,61 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Collections;
-
-/**
- * SortedIterator presents the elements of another iterator in a sorted order.
- */
-public class SortedIterator implements Iterator
-{
-  public SortedIterator(
-    Iterator unsorted)
-  {
-     // this implementation just pulls the entire contents into a list --
-     // it will be awkward if the unsorted iterator is infinite
-     ArrayList sortedList = new ArrayList();
-     while(unsorted.hasNext())
-     {
-       sortedList.add(unsorted.next());
-     }
-     Collections.sort(sortedList);
-     _sorted = sortedList.iterator();
-  }
-
-  public boolean hasNext()
-  {
-    return _sorted.hasNext();
-  }
-
-  public Object next()
-  {
-    return _sorted.next();
-  }
-
-  public void remove()
-  {
-    throw new UnsupportedOperationException();
-  }
-
-  private final Iterator _sorted;
-
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/SourceTemplate.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/SourceTemplate.java
deleted file mode 100644
index 1d29edd..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/SourceTemplate.java
+++ /dev/null
@@ -1,164 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.util;
-
-import java.io.*;
-import java.util.*;
-
-public class SourceTemplate
-{
-  public SourceTemplate(File file)
-  {
-    _file = file;
-  }
-
-  public void substitute(String in, String out)
-  {
-    _substitutions.put(in, out);
-  }
-
-  public Set getImports()
-  {
-    return Collections.unmodifiableSet(_imports);
-  }
-
-  public Set getImplements()
-  {
-    return Collections.unmodifiableSet(_implements);
-  }
-
-  public void readPreface() throws IOException
-  {
-    _reader = new BufferedReader(new FileReader(_file));
-    while (true)
-    {
-      String line = _reader.readLine();
-      if (line == null)
-        throw new EOFException("File " + _file + " ended prematurely");
-
-      if (line.equals("{"))
-        break;
-
-      if (line.startsWith("import "))
-      {
-        line = line.trim();
-        String imported = line.substring("import ".length(),
-                                         line.length() - 1);
-        _imports.add(imported);
-        _fqcnMap.put(Util.getClassFromFullClass(imported), imported);
-      }
-
-      int index = line.indexOf(" implements ");
-      if (index != -1)
-      {
-        String clause = line.substring(index + " implements ".length());
-        String[] interfaces = clause.split(", ");
-        for (int i=0; i < interfaces.length; i++)
-        {
-          String className = interfaces[i];
-          if (!Util.isFullClass(className))
-          {
-            String importedName = (String)_fqcnMap.get(className);
-            if (importedName != null)
-              className = importedName;
-          }
-          _implements.add(className);
-        }
-      }
-    }
-  }
-
-
-  public void writeContent(Writer out) throws IOException
-  {
-    while (true)
-    {
-      String line = _reader.readLine();
-      if (line == null)
-        throw new EOFException("File " + _file + " ended prematurely");
-
-      if (line.trim().startsWith(_IGNORE_PREFIX)){
-          if (line.trim().startsWith(_IGNORE_PREFIX2)){
-              String method = line.trim().substring(_IGNORE_PREFIX2.length()).trim();
-              if (method.length() > 0 ){
-                  _ignoreMethods.add(method);
-              }
-          }
-          continue;
-      }
-
-      if (line.equals("}"))
-        break;
-
-      line = _substitute(line);
-      out.write(line);
-      out.write("\n");
-    }
-  }
-
-  public void close() throws IOException
-  {
-    _reader.close();
-  }
-
-  private String _substitute(String in)
-  {
-    Iterator keys = _substitutions.keySet().iterator();
-    while (keys.hasNext())
-    {
-      String key = (String) keys.next();
-      String value = (String) _substitutions.get(key);
-      in = _substitute(in, key, value);
-    }
-
-    return in;
-  }
-
-  static private String _substitute(String in, String from, String to)
-  {
-    int index = in.indexOf(from);
-    if (index < 0)
-      return in;
-
-    StringBuffer buffer = new StringBuffer(in.length() +
-                                           to.length() - from.length());
-    buffer.append(in.substring(0, index));
-    buffer.append(to);
-    String suffix = in.substring(index + from.length());
-    buffer.append(_substitute(suffix, from, to));
-
-    return buffer.toString();
-  }
-
-    public Collection getIgnoreMethods() {
-        return _ignoreMethods;
-    }
-
-    private File           _file;
-  private BufferedReader _reader;
-  private Set            _imports = new HashSet();
-  private Map            _fqcnMap = new HashMap();
-  private Set            _implements = new HashSet();
-  private Map            _substitutions = new HashMap();
-  private Set            _ignoreMethods = new HashSet();
-
-  // Magic syntax indicating "please ignore this line"
-  static private final String _IGNORE_PREFIX = "/**/";
-  static private final String _IGNORE_PREFIX2 = "/**///";
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/Util.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/Util.java
deleted file mode 100644
index de9fbae..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/Util.java
+++ /dev/null
@@ -1,489 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.util;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class Util
-{
-  static public String convertClassToSourcePath(
-    String className,
-    String fileExtension)
-  {
-    return (className.replace('.', File.separatorChar) + fileExtension);
-  }
-
-  static public boolean isFullClass(
-    String className)
-  {
-    return (className != null && className.indexOf('.') != -1);
-  }
-
-  public static String getGenericsFromProperty(PropertyBean property){
-      String gen = "";
-      for (int i = 0; i < property.getAttributeClassParameters().length; i++) {
-          if (i>0){
-              gen += ",";
-          }
-          gen += getClassFromFullClass(property.getAttributeClassParameters()[i]);          
-      }
-      return (gen.length() > 0?"<"+gen+">":gen);
-  }
-
-  static public String getClassFromFullClass(
-    String fullClass)
-  {
-    if (fullClass == null)
-      return null;
-
-    int lastSep = fullClass.lastIndexOf('.');
-    // Note: this code also works for the empty package
-    return (fullClass.substring(lastSep + 1));
-  }
-
-  static public String getPackageFromFullClass(
-    String fullClass)
-  {
-    if (fullClass == null)
-      return null;
-
-    int lastSep = fullClass.lastIndexOf('.');
-
-    // detect the empty package
-    if (lastSep == -1)
-      return "";
-
-    return (fullClass.substring(0, lastSep));
-  }
-
-  static public String getConstantNameFromProperty(
-    String propertyName)
-  {
-    return getConstantNameFromProperty(propertyName, null);
-  }
-
-  static public String getConstantNameFromProperty(
-    String propertyName,
-    String constantSuffix)
-  {
-    StringBuffer constantName = new StringBuffer();
-
-    for (int i=0; i < propertyName.length(); i++)
-    {
-      char ch = propertyName.charAt(i);
-      if (i > 0 &&
-          Character.isUpperCase(ch) &&
-          Character.isLowerCase(propertyName.charAt(i-1)))
-      {
-        constantName.append('_');
-      }
-      ch = Character.toUpperCase(ch);
-      constantName.append(ch);
-    }
-
-    if (constantSuffix != null)
-      constantName.append(constantSuffix);
-
-    return constantName.toString();
-  }
-
-  static public String getPrefixedPropertyName(
-    String prefix,
-    String propertyName)
-  {
-    return prefix + Character.toUpperCase(propertyName.charAt(0)) +
-           propertyName.substring(1);
-  }
-  
-  static public String getPropertyClass(PropertyBean property)
-  {
-    String propertyFullClass = property.getPropertyClass();
-    String propertyClass = Util.getClassFromFullClass(propertyFullClass);
-    String[] genericTypes = property.getPropertyClassParameters();
-    if(genericTypes != null && genericTypes.length > 0)
-    {
-      StringBuffer buffer = new StringBuffer(60);
-      buffer.append(propertyClass);
-      buffer.append('<');
-      int max = genericTypes.length - 1;
-      for(int i = 0; i <= max; i++)
-      {
-        _buildPropertyClass(buffer, genericTypes[i]);
-        if(i < max)
-        {
-          buffer.append(", ");
-        }
-      }
-      buffer.append('>');
-      
-      propertyClass = buffer.toString();
-    }
-    
-    return propertyClass;
-  }
-
-  static public String getMethodNameFromEvent(
-    String methodPrefix,
-    String eventName,
-    String methodSuffix)
-  {
-    return methodPrefix +
-           Character.toUpperCase(eventName.charAt(0)) +
-           eventName.substring(1) +
-           methodSuffix;
-  }
-
-  static public String getMethodReaderFromProperty(
-    String propertyName,
-    String propertyClass)
-  {
-    String methodPrefix = ("boolean".equals(propertyClass) ? "is" : "get");
-    return getPrefixedPropertyName(methodPrefix, propertyName);
-  }
-
-  static public String getEventNameFromEventType(
-    String eventFullClass)
-  {
-    String eventName = getClassFromFullClass(eventFullClass);
-    return Character.toLowerCase(eventName.charAt(0)) +
-           eventName.substring(1, eventName.length());
-  }
-
-  static public boolean isPrimitiveClass(
-    String className)
-  {
-    return "boolean".equals(className) ||
-           "byte".equals(className) ||
-           "char".equals(className) ||
-           "double".equals(className) ||
-           "float".equals(className) ||
-           "int".equals(className) ||
-           "long".equals(className) ||
-           "short".equals(className);
-  }
-  
-  static public String getAlternatePropertyClass(PropertyBean property)
-  {
-    StringBuffer buffer = new StringBuffer(60);
-    _buildPropertyClass(buffer, property.getAlternateClass());
-    
-    return buffer.toString();
-  }
-  
-  static public String getPrimitiveType(String className){      
-      if (className.startsWith("java.lang."))
-      {
-          className = className.replace("java.lang.", "");
-      }
-      
-      if (className.endsWith("eger"))
-      {
-          className = className.replace("eger", "");
-      }
-      
-      if (Util.isPrimitiveClass(className.toLowerCase()))
-      {
-          return className.toLowerCase();
-      }else
-      {
-          return null;
-      }
-      
-  }
-
-  static public String getBoxedClass(
-    String className)
-  {
-    if ("boolean".equals(className))
-      return "Boolean";
-    else if ("byte".equals(className))
-      return "Byte";
-    else if ("char".equals(className))
-      return "Character";
-    else if ("double".equals(className))
-      return "Double";
-    else if ("float".equals(className))
-      return "Float";
-    else if ("int".equals(className))
-      return "Integer";
-    else if ("long".equals(className))
-      return "Long";
-    else if ("short".equals(className))
-      return "Short";
-    else
-      return className;
-  }
-
-  static public String primitiveDefaultValue(String className)
-  {
-     if ("boolean".equals(className))
-      return "false";
-    else if ("byte".equals(className))
-      return "0";
-    else if ("char".equals(className))
-      return "''";
-    else if ("double".equals(className))
-      return "0.0d";
-    else if ("float".equals(className))
-      return "0.0f";
-    else if ("int".equals(className))
-      return "0";
-    else if ("long".equals(className))
-      return "0L";
-    else if ("short".equals(className))
-      return "0";
-    else
-      return className;
-  }
-
-  static public String fill(
-    String base,
-    int    length)
-  {
-    if (base == null || base.length() > length)
-      return base;
-
-    StringBuffer filled = new StringBuffer(base);
-    for (int i=base.length(); i < length; i++)
-    {
-      filled.append(' ');
-    }
-    return filled.toString();
-  }
-
-  static public String getVariableFromClass(
-    String className)
-  {
-    if (className == null)
-      return null;
-
-    for (int i=0; i < className.length(); i++)
-    {
-      char ch = className.charAt(i);
-      if (Character.isLowerCase(ch))
-      {
-        if (i > 0)
-        {
-          return Character.toLowerCase(className.charAt(i - 1)) +
-                 className.substring(i);
-        }
-        break;
-      }
-    }
-
-    throw new IllegalStateException("Class name \"" + className +
-                                    "\" does not use initcaps");
-  }
-
-  static public String getVariableFromName(
-    String name)
-  {
-    if (name == null)
-      return null;
-
-    if (RESERVED_WORDS.contains(name))
-      name = name + "Param";
-
-    return name;
-  }
-
-  static public String convertStringToLiteral(String value)
-  {
-    return convertStringToLiteral("String", value);
-  }
-
-  static public String convertStringToLiteral(String className, String value)
-  {
-    if (value == null)
-    {
-      return null;
-    }
-    else if ("String".equals(className))
-    {
-      return "\"" + value.replaceAll("\'", "\\'") + "\"";
-    }
-    else if ("Number".equals(className))
-    {
-      // Double vs. Integer.
-      if(value.indexOf(".") == -1)
-      {
-        return "Integer.valueOf(" + value + ")";
-      }
-      else
-      {
-        return "Double.valueOf(" + value + ")";
-      }
-    }
-    else
-    {
-      return value;
-    }
-  }
-
-    static public String getDefaultValue(PropertyBean property){
-        String propertyFullClass = property.getPropertyClass();
-        String def = property.getDefaultValue();
-        if (def == null || def.length() == 0){
-            return null;
-        }
-        if (isPrimitiveClass(propertyFullClass)){
-            return def;
-        } else if ("java.lang.String".equals(propertyFullClass)){
-            if (def.startsWith("\"") && def.endsWith("\"")){
-                return def;
-            } else {
-                return "\""+def+"\"";
-            }
-        }else{
-            //Any other class, so we return the default value
-            return def;            
-        }
-    }
-
-    static private void _buildPropertyClass(StringBuffer buffer, String type)
-  {
-    Matcher matcher = _GENERIC_TYPE.matcher(type);
-    if(matcher.matches())
-    {
-      // Generic type
-      buffer.append(Util.getClassFromFullClass(matcher.group(1)));
-      buffer.append('<');
-      String[] types = matcher.group(2).split(",");
-      int max = types.length - 1;
-      for(int i = 0; i <= max; i++)
-      {
-        _buildPropertyClass(buffer, types[i]);
-        if(i < max)
-        {
-          buffer.append(", ");
-        }
-      }
-      buffer.append('>');
-    }
-    else
-    {
-      // Non-generic type
-      buffer.append(Util.getClassFromFullClass(type));
-    }
-  }
-
-  static private Set _createPrimitiveTypesSet()
-  {
-    Set primitives = new TreeSet();
-    for (int i=0; i < _PRIMITIVE_TYPES.length; i++)
-    {
-      String type = _PRIMITIVE_TYPES[i];
-      primitives.add(type);
-      primitives.add(type + "[]");
-    }
-    return Collections.unmodifiableSet(primitives);
-  }
-
-  static private Set _createReservedWordsSet()
-  {
-    Set reserved = new TreeSet();
-    for (int i=0; i < _RESERVED_WORDS.length; i++)
-    {
-      String keyword = _RESERVED_WORDS[i];
-      reserved.add(keyword);
-    }
-    return Collections.unmodifiableSet(reserved);
-  }
-
-  static private final String[] _PRIMITIVE_TYPES = new String[]
-  {// TODO: Shouldn't java.lang.* be specified in that list as well?
-    "boolean",
-    "byte",
-    "char",
-    "float",
-    "double",
-    "int",
-    "short",
-    "long",
-  };
-
-  static private final String[] _RESERVED_WORDS = new String[]
-  {
-    "abstract",
-    "assert",
-    "boolean",
-    "break",
-    "byte",
-    "case",
-    "catch",
-    "char",
-    "class",
-    "const",
-    "continue",
-    "default",
-    "do",
-    "double",
-    "else",
-    "extends",
-    "final",
-    "finally",
-    "float",
-    "for",
-    "goto",
-    "if",
-    "implements",
-    "import",
-    "instanceof",
-    "int",
-    "interface",
-    "long",
-    "native",
-    "new",
-    "package",
-    "private",
-    "protected",
-    "public",
-    "return",
-    "short",
-    "static",
-    "super",
-    "switch",
-    "synchronized",
-    "this",
-    "throw",
-    "throws",
-    "transient",
-    "try",
-    "void",
-    "volatile",
-    "while",
-  };
-
-  static public final Set RESERVED_WORDS = _createReservedWordsSet();
-  static public final Set PRIMITIVE_TYPES = _createPrimitiveTypesSet();
-
-  static private final Pattern _GENERIC_TYPE = Pattern.compile("([^<]+)<(.+)>");
-
-  // no instances
-  private Util()
-  {
-  }
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/ValidatorFilter.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/ValidatorFilter.java
deleted file mode 100644
index 20314cc..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/ValidatorFilter.java
+++ /dev/null
@@ -1,33 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.util;
-
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ValidatorBean;
-
-abstract public class ValidatorFilter implements Filter
-{
-  final public boolean accept(
-    Object obj)
-  {
-    return accept((ValidatorBean)obj);
-  }
-
-  abstract protected boolean accept(
-    ValidatorBean validator);
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/XIncludeFilter.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/XIncludeFilter.java
deleted file mode 100644
index 450147d..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/XIncludeFilter.java
+++ /dev/null
@@ -1,186 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.util;
-
-import java.io.IOException;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import java.util.Stack;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.NamespaceSupport;
-import org.xml.sax.helpers.XMLFilterImpl;
-
-public final class XIncludeFilter extends XMLFilterImpl
-{
-  public final static String XINCLUDE_NAMESPACE = "http://www.w3.org/2001/XInclude";
-
-  public XIncludeFilter(
-    XMLReader parent,
-    URL       base)
-  {
-    super(parent);
-    bases.push(base);
-  }
-
-  public void setDocumentLocator(
-    Locator locator)
-  {
-    locators.push(locator);
-    super.setDocumentLocator(locator);
-  }
-
-  public void startPrefixMapping(
-    String prefix,
-    String namespaceURI) throws SAXException
-  {
-    if (!namespaceURI.equals(XINCLUDE_NAMESPACE))
-    {
-      namespaces.declarePrefix(prefix, namespaceURI);
-      super.startPrefixMapping(prefix, namespaceURI);
-    }
-  }
-
-  public void startElement(
-    String     namespaceURI,
-    String     localName,
-    String     qualifiedName,
-    Attributes attributes) throws SAXException
-  {
-    namespaces.pushContext();
-    // support both DTD and Schema
-    if (namespaceURI.equals(XINCLUDE_NAMESPACE) &&
-        localName.equals("include"))
-    {
-      // href attribute is required
-      String href = attributes.getValue("href");
-      if (href == null)
-        throw new SAXException("Missing href attribute");
-
-      // xpointer attribute is optional
-      String xpointer = attributes.getValue("xpointer");
-
-      doXInclude(href, xpointer);
-    }
-    else
-    {
-      super.startElement(namespaceURI, localName, qualifiedName, attributes);
-    }
-  }
-
-  public void endElement(
-    String     namespaceURI,
-    String     localName,
-    String     qualifiedName) throws SAXException
-  {
-    if (!namespaceURI.equals(XINCLUDE_NAMESPACE))
-      super.endElement(namespaceURI, localName, qualifiedName);
-
-    namespaces.popContext();
-  }
-
-  public void startDocument() throws SAXException
-  {
-    if (depth == 0)
-      super.startDocument();
-
-    depth++;
-  }
-
-  public void endDocument() throws SAXException
-  {
-    locators.pop();
-    depth--;
-
-    if (depth == 0)
-      super.endDocument();
-  }
-
-  private void doXInclude(
-    String href,
-    String xpointer) throws SAXException
-  {
-    URL target = resolveURL(href);
-
-    try
-    {
-      SAXParserFactory saxFactory = SAXParserFactory.newInstance();
-      SAXParser saxParser = saxFactory.newSAXParser();
-      XMLReader reader = saxParser.getXMLReader();
-      if (xpointer != null)
-      {
-        // pass all parsed SAX events through XPointerFilter
-        reader = new XPointerFilter(reader, namespaces, xpointer);
-      }
-      // pass all selected XPointer SAX events to XIncludeFilter
-      reader.setContentHandler(this);
-      reader.setEntityResolver(this);
-      reader.setErrorHandler(this);
-      reader.setDTDHandler(this);
-
-      // push on new base URL in case of nested xi:include
-      bases.push(target);
-      reader.parse(new InputSource(target.openStream()));
-      bases.pop();
-    }
-    catch (ParserConfigurationException e)
-    {
-      throw new SAXException("Error during xinclude of " +
-                             target.toExternalForm(), e);
-    }
-    catch (IOException e)
-    {
-      throw new SAXException("Error during xinclude of " +
-                             target.toExternalForm(), e);
-    }
-  }
-
-  private URL resolveURL(
-    String href) throws SAXException
-  {
-    URL base = (URL) bases.peek();
-
-    try
-    {
-      return new URL(base, href);
-    }
-    catch (MalformedURLException e)
-    {
-      throw new SAXException("Error resolving href \"" + href + "\" " +
-                             "at base \"" + base + "\"", e);
-    }
-  }
-
-  private int depth = 0;
-
-  private Stack bases = new Stack();
-  private Stack locators = new Stack();
-  private NamespaceSupport namespaces = new NamespaceSupport();
-}
-
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/XPointerFilter.java b/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/XPointerFilter.java
deleted file mode 100644
index 49e7ab4..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/faces/util/XPointerFilter.java
+++ /dev/null
@@ -1,111 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces.util;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.NamespaceSupport;
-import org.xml.sax.helpers.XMLFilterImpl;
-
-/**
- * For now, just skip the root element since that's our usecase.
- */
-public final class XPointerFilter extends XMLFilterImpl
-{
-  public XPointerFilter(
-    XMLReader        parent,
-    NamespaceSupport namespaces,
-    String           xpointer)
-  {
-    super(parent);
-
-    // We support a very rudimentary - but totally sufficient - XPointer syntax,
-    // which is just /element/otherelement/otherotherelement/*
-    if (!xpointer.startsWith("/") || !xpointer.endsWith("/*"))
-      throw new IllegalArgumentException("Unsupported xpointer syntax: " +
-                                         xpointer);
-
-    xpointer = xpointer.substring(0, xpointer.length() - 2).substring(1);
-    String[] elements = xpointer.split("/");
-    int count = elements.length;
-
-    _rootNamespaceURI = new String[count];
-    _rootLocalName = new String[count];
-    _acceptChildNodes = new boolean[count];
-
-    for (int i = 0; i < count; i++)
-    {
-      String[] parts = elements[i].split(":");
-      String prefix = (parts.length == 1) ? "" : parts[0];
-      String namespaceURI = namespaces.getURI(prefix);
-      _rootNamespaceURI[i] = (namespaceURI != null) ? namespaceURI : "";
-      _rootLocalName[i] = (parts.length == 1) ? parts[0] : parts[1];
-      _acceptChildNodes[i] = false;
-    }
-  }
-
-  public void startElement(
-    String     namespaceURI,
-    String     localName,
-    String     qualifiedName,
-    Attributes attributes) throws SAXException
-  {
-    if (_depth < _acceptChildNodes.length)
-    {
-      _acceptChildNodes[_depth] =
-           (_rootNamespaceURI[_depth].equals(namespaceURI) &&
-            _rootLocalName[_depth].equals(localName));
-    }
-    else if (_acceptingChildNodes())
-    {
-      super.startElement(namespaceURI, localName, qualifiedName, attributes);
-    }
-
-    _depth++;
-  }
-
-  public void endElement(
-    String namespaceURI,
-    String localName,
-    String qualifiedName) throws SAXException
-  {
-    _depth--;
-
-    if (_depth >= _acceptChildNodes.length && _acceptingChildNodes())
-      super.endElement(namespaceURI, localName, qualifiedName);
-  }
-
-  
-  private boolean _acceptingChildNodes()
-  {
-    for (int i = _acceptChildNodes.length - 1; i >= 0; i--)
-    {
-      if (!_acceptChildNodes[i])
-        return false;
-    }
-
-    return true;
-  }
-
-  private int     _depth;
-  private boolean[] _acceptChildNodes;
-  private String[]  _rootNamespaceURI;
-  private String[]  _rootLocalName;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/resources/META-INF/schemas/maven-faces-plugin.xsd b/maven2-plugins/myfaces-faces-plugin/src/main/resources/META-INF/schemas/maven-faces-plugin.xsd
deleted file mode 100644
index 60cebf4..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/resources/META-INF/schemas/maven-faces-plugin.xsd
+++ /dev/null
@@ -1,132 +0,0 @@
-<?xml version = "1.0" encoding = "UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-	   
--->
-<xsd:schema xmlns:mfp="http://myfaces.apache.org/maven-faces-plugin"
-            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
-            targetNamespace="http://myfaces.apache.org/maven-faces-plugin"
-            elementFormDefault="qualified"
-            attributeFormDefault="unqualified"
-            version="1.2">
-
-    <xsd:annotation>
-        <xsd:documentation>
-            $Id: $
-        </xsd:documentation>
-    </xsd:annotation>
-
-    <!-- **************************************************** -->
-
-    <xsd:element name="component" type="mfp:componentType" />
-    <xsd:element name="property" type="mfp:propertyType" />
-
-    <!-- **************************************************** -->
-
-    <xsd:complexType name="propertyType">
-        <xsd:sequence>
-            <xsd:element name="required"
-                         type="xsd:boolean"
-                         minOccurs="0"
-                         maxOccurs="1" />
-            <xsd:element name="alias-of"
-                         type="xsd:string"
-                         minOccurs="0"
-                         maxOccurs="1" />
-            <xsd:element name="transient"
-                         type="xsd:boolean"
-                         minOccurs="0"
-                         maxOccurs="1" />
-            <xsd:element name="state-holder"
-                         type="xsd:boolean"
-                         minOccurs="0"
-                         maxOccurs="1" />
-            <xsd:element name="requires-literal" type="xsd:boolean"
-                         minOccurs="0"/>
-            <xsd:element name="virtual" type="xsd:boolean"/>
-            <xsd:element name="method-binding-signature"
-                         type="mfp:method-binding-signatureType" minOccurs="0"/>
-        </xsd:sequence>
-    </xsd:complexType>
-
-    <xsd:complexType name="componentType">
-        <xsd:sequence>
-            <xsd:element name="component-family"
-                         type="xsd:string"
-                         minOccurs="0"
-                         maxOccurs="1" />
-            <xsd:element name="renderer-type"
-                         type="xsd:string"
-                         minOccurs="0"
-                         maxOccurs="1" />
-            <xsd:element name="component-supertype"
-                         type="xsd:string"
-                         minOccurs="0"
-                         maxOccurs="1" />
-            <xsd:element name="component-superclass"
-                         type="xsd:string"
-                         minOccurs="0"
-                         maxOccurs="1" />
-            <xsd:element name="default-renderer-type"
-                         type="xsd:string"
-                         minOccurs="0"
-                         maxOccurs="1" />
-            <xsd:element name="naming-container" type="xsd:boolean"
-                         minOccurs="0"/>
-            <xsd:element name="jsp-tag-class" type="xsd:string"/>
-            <xsd:element name="event"
-                         type="mfp:component-eventType"
-                         minOccurs="0"
-                         maxOccurs="unbounded" />
-        </xsd:sequence>
-    </xsd:complexType>
-
-    <!-- **************************************************** -->
-
-    <xsd:complexType name="component-eventType">
-        <xsd:sequence>
-            <xsd:element name="event-name"
-                         type="xsd:string"
-                         minOccurs="1"
-                         maxOccurs="1" />
-            <xsd:element name="event-listener-class"
-                         type="xsd:string"
-                         minOccurs="0"
-                         maxOccurs="1" />
-            <xsd:element name="event-class"
-                         type="xsd:string"
-                         minOccurs="0"
-                         maxOccurs="1" />
-            <xsd:element name="event-source-interface"
-                         type="xsd:string"
-                         minOccurs="0"
-                         maxOccurs="1" />
-            <xsd:element name="event-delivery-phases" type="xsd:string"
-                         minOccurs="0"/>
-        </xsd:sequence>
-    </xsd:complexType>
-    <xsd:complexType name="method-binding-signatureType">
-        <xsd:sequence>
-            <xsd:element name="parameter-type" type="xsd:string" minOccurs="0"
-                         maxOccurs="unbounded"/>
-            <xsd:element name="return-type" type="xsd:string"/>
-        </xsd:sequence>
-    </xsd:complexType>
-    <!-- **************************************************** -->
-
-</xsd:schema>
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/faces/resources/faces-config.xml b/maven2-plugins/myfaces-faces-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/faces/resources/faces-config.xml
deleted file mode 100644
index 05ba76d..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/faces/resources/faces-config.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-	   
--->
-<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
-              xmlns:xi="http://www.w3.org/2001/XInclude"
-              xmlns:mfp="http://myfaces.apache.org/maven-faces-plugin" />
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/faces/resources/transform.xsl b/maven2-plugins/myfaces-faces-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/faces/resources/transform.xsl
deleted file mode 100644
index 93370ac..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/faces/resources/transform.xsl
+++ /dev/null
@@ -1,940 +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.
-	   
--->
-<xsl:stylesheet xmlns="http://java.sun.com/JSF/Configuration"
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
-                xmlns:xs="http://www.w3.org/2001/XMLSchema"
-                xmlns:javaee="http://java.sun.com/xml/ns/javaee"
-                xmlns:mfp="http://myfaces.apache.org/maven-faces-plugin" 
-                exclude-result-prefixes="xsl xs javaee mfp"
-                version="1.0" >
-
-  <xsl:output method="xml" indent="yes"/>
-  <xsl:param name="packageContains" />
-  <xsl:param name="typePrefix" />
-  <xsl:param name="removeRenderers" />
-
-  <xsl:variable name="doctype" ><![CDATA[
-  <!DOCTYPE faces-config PUBLIC
-  "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
-  "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"[
-  <!ELEMENT component-metadata ANY>
-  <!ELEMENT attribute-metadata ANY>
-  <!ELEMENT property-metadata ANY>
-  <!ELEMENT facet-metadata ANY>
-  <!ELEMENT renderer-metadata ANY>
-  <!ELEMENT accepts-child-components (#PCDATA)>
-  <!ELEMENT attribute-values (#PCDATA)>
-  <!ELEMENT base-component-type (#PCDATA)>
-  <!ELEMENT deprecated (#PCDATA)>
-  <!ELEMENT display-order (#PCDATA)>
-  <!ELEMENT expert (#PCDATA)>
-  <!ELEMENT favorite-property (#PCDATA)>
-  <!ELEMENT group (#PCDATA)>
-  <!ELEMENT help-topic (#PCDATA)>
-  <!ELEMENT hidden (#PCDATA)>
-  <!ELEMENT initial-value (#PCDATA)>
-  <!ELEMENT preferred (#PCDATA)>
-  <!ELEMENT preferred-children (#PCDATA)>
-  <!ELEMENT allowable-children (#PCDATA)>
-  <!ELEMENT preferred-component-types (#PCDATA)>
-  <!ELEMENT property-editor (#PCDATA)>
-  <!ELEMENT short-description (#PCDATA)>
-  <!ELEMENT translatable (#PCDATA)>
-  <!ELEMENT unsupported-agents (#PCDATA)>
-  <!ATTLIST component-metadata component-type CDATA #IMPLIED>
-]>
-]]></xsl:variable>
-
-  <xsl:key name="component-type" 
-           match="javaee:component" 
-           use="javaee:component-type/text()" />
-
-  <xsl:key name="render-kit-id" 
-           match="javaee:render-kit" 
-           use="javaee:render-kit-id/text()" />
-
-  <!-- switch off default text processing -->  
-  <xsl:template match="//text()" />
-
-  <xsl:template match="/javaee:faces-config" >
-    <xsl:value-of disable-output-escaping="yes" select="$doctype" />
-    <xsl:element name="faces-config"
-                 namespace="http://java.sun.com/JSF/Configuration" >
-      <xsl:apply-templates select="javaee:application" />
-      <xsl:apply-templates select="javaee:factory" />
-      <xsl:apply-templates select="javaee:component[not(contains(javaee:component-extension/mfp:component-class-modifier/text(), 'abstract')) and
-                                                    starts-with(javaee:component-type, $typePrefix)]" />
-      <!-- In tomahawk 1.1 some converters should be added
-      on faces-config.xml like javax.math.BigDecimal, if we
-      include javaee:converter[contains(javaee:converter-class, $packageContains)] 
-      this class references are not added to faces-config.xml. 
-      So we need to add this for avoid check packaageContains -->                                                    
-      <xsl:apply-templates select="javaee:converter" />
-      <xsl:apply-templates select="javaee:managed-bean[contains(javaee:managed-bean-class, $packageContains)]" />
-      <xsl:apply-templates select="javaee:navigation-rule" />
-      <xsl:apply-templates select="javaee:referenced-bean" />
-      <!-- merge the render-kits together -->
-      <!-- In tomahawk 1.1 we don't merge render-kit,
-      because we add all components to HTML_BASIC renderkit,
-      and the render-kit-class is missing (myfaces core or jsf ri
-      decide what class implement this). 
-      So, here we cannot put 
-      javaee:render-kit[contains(javaee:render-kit-class, $packageContains)]
-      again
-       -->      
-      <xsl:for-each select="javaee:render-kit" >
-        <xsl:element name="render-kit" >
-          <xsl:apply-templates select="javaee:description" />
-          <xsl:apply-templates select="javaee:display-name" />
-          <xsl:apply-templates select="javaee:icon" />
-          <xsl:apply-templates select="javaee:render-kit-id" />
-          <!-- Not required in tomahawk 1.1 --> 
-          <xsl:apply-templates select="javaee:render-kit-class" />
-           
-          <!-- Drop renderers if desired -->
-          <xsl:if test="$removeRenderers != 'true'">
-            <xsl:for-each select="key('render-kit-id', javaee:render-kit-id/text())" >
-              <xsl:apply-templates select="javaee:renderer[contains(javaee:renderer-class, $packageContains)]" />
-            </xsl:for-each>
-          </xsl:if>
-        </xsl:element>
-      </xsl:for-each>
-      <xsl:apply-templates select="javaee:lifecycle[contains(javaee:phase-listener, $packageContains)]" />
-      <xsl:apply-templates select="javaee:validator[contains(javaee:validator-class, $packageContains)]" />
-    </xsl:element>
-  </xsl:template>
-
-  <!-- this templates applies javaee:property templates
-       for a component and all supertypes -->
-  <xsl:template name="apply-property-templates" >
-    <xsl:param name="component" />
-    <xsl:variable name="componentSupertype"
-                  select="$component/javaee:component-extension/mfp:component-supertype/text()" />
-    <xsl:if test="$componentSupertype" >
-      <xsl:call-template name="apply-property-templates" >
-        <xsl:with-param name="component" 
-                        select="key('component-type', $componentSupertype)" />
-      </xsl:call-template>
-    </xsl:if>
-    <xsl:apply-templates select="$component/javaee:property" />
-  </xsl:template>
-  
-  <!-- this templates applies javaee:attribute templates
-       for a component and all supertypes -->
-  <xsl:template name="apply-attribute-templates" >
-    <xsl:param name="component" />
-    <xsl:variable name="componentSupertype"
-                  select="$component/javaee:component-extension/mfp:component-supertype/text()" />
-    <xsl:if test="$componentSupertype" >
-      <xsl:call-template name="apply-attribute-templates" >
-        <xsl:with-param name="component"
-                        select="key('component-type', $componentSupertype)" />
-      </xsl:call-template>
-    </xsl:if>
-    <xsl:apply-templates select="$component/javaee:attribute" />
-  </xsl:template>
-  
-  <!-- this templates applies javaee:facet templates
-       for a component and all supertypes -->
-  <xsl:template name="apply-facet-templates" >
-    <xsl:param name="component" />
-    <xsl:variable name="componentSupertype"
-                  select="$component/javaee:component-extension/mfp:component-supertype/text()" />
-    <xsl:if test="$componentSupertype" >
-      <xsl:call-template name="apply-facet-templates" >
-        <xsl:with-param name="component"
-                        select="key('component-type', $componentSupertype)" />
-      </xsl:call-template>
-    </xsl:if>
-    <xsl:apply-templates select="$component/javaee:facet" />
-  </xsl:template>
-  
-  <xsl:template match="//javaee:component[javaee:component-extension/mfp:component-supertype]" 
-                priority="1" >
-    <xsl:element name="component" >
-      <xsl:apply-templates select="javaee:description" />
-      <xsl:apply-templates select="javaee:display-name" />
-      <xsl:apply-templates select="javaee:icon" />
-      <xsl:apply-templates select="javaee:component-type" />
-      <xsl:apply-templates select="javaee:component-class" />
-      <xsl:call-template name="apply-facet-templates" >
-        <xsl:with-param name="component" select="." />
-      </xsl:call-template>
-      <xsl:call-template name="apply-attribute-templates" >
-        <xsl:with-param name="component" select="." />
-      </xsl:call-template>
-      <xsl:call-template name="apply-property-templates" >
-        <xsl:with-param name="component" select="." />
-      </xsl:call-template>
-      <xsl:apply-templates select="javaee:component-extension" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:application" >
-    <xsl:element name="application" >
-      <xsl:apply-templates select="javaee:action-listener[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:default-render-kit-id" />
-      <xsl:apply-templates select="javaee:message-bundle[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:view-handler[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:state-manager[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:navigation-handler[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:property-resolver[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:variable-resolver[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:locale-config" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:action-listener" >
-    <xsl:element name="action-listener" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:default-render-kit-id" >
-    <xsl:element name="default-render-kit-id" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:message-bundle" >
-    <xsl:element name="message-bundle" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:navigation-handler" >
-    <xsl:element name="navigation-handler" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:view-handler" >
-    <xsl:element name="view-handler" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:state-manager" >
-    <xsl:element name="state-manager" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:property-resolver" >
-    <xsl:element name="property-resolver" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:variable-resolver" >
-    <xsl:element name="variable-resolver" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:locale-config" >
-    <xsl:element name="locale-config" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:factory" >
-    <xsl:element name="factory" >
-      <xsl:apply-templates select="javaee:application-factory[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:faces-context-factory[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:lifecycle-factory[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:render-kit-factory[contains(text(), $packageContains)]" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:application-factory" >
-    <xsl:element name="application-factory" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:faces-context-factory" >
-    <xsl:element name="faces-context-factory" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:lifecycle-factory" >
-    <xsl:element name="lifecycle-factory" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:render-kit-factory" >
-    <xsl:element name="render-kit-factory" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:component" >
-    <xsl:element name="component" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:component-type" >
-    <xsl:element name="component-type" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:component-class" >
-    <xsl:element name="component-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:component/javaee:facet[1]" priority="1" >
-    <xsl:comment><xsl:value-of select="parent::node()/javaee:component-type/text()" /> facets</xsl:comment>
-    <xsl:element name="facet" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:facet" >
-    <xsl:element name="facet" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:facet-name" >
-    <xsl:element name="facet-name" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:facet-extension[mfp:facet-metadata|mfp:allowable-children|mfp:preferred-children|mfp:preferred|mfp:unsupported-agents|mfp:deprecated]" >
-    <xsl:element name="facet-extension" >
-      <xsl:element name="facet-metadata" >
-        <xsl:apply-templates/>
-      </xsl:element>
-    </xsl:element>
-  </xsl:template>
-
-  
-  <xsl:template match="//javaee:component/javaee:attribute[1]" priority="1" >
-    <xsl:comment><xsl:value-of select="parent::node()/javaee:component-type/text()" /> attributes</xsl:comment>
-    <xsl:element name="attribute" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:component/javaee:attribute[1]" priority="1" >
-    <xsl:comment><xsl:value-of select="parent::node()/javaee:component-type/text()" /> attributes</xsl:comment>
-    <xsl:element name="attribute" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:attribute" >
-    <xsl:element name="attribute" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:attribute-name" >
-    <xsl:element name="attribute-name" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:attribute-class" >
-    <xsl:element name="attribute-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:attribute-extension" >
-    <xsl:element name="attribute-extension" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:component/javaee:property[1]" priority="1" >
-    <xsl:comment><xsl:value-of select="parent::node()/javaee:component-type/text()" /> properties</xsl:comment>
-    <xsl:element name="property" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:property[javaee:property-name/text() = 'binding']" priority='2' >
-    <!-- skip over properties named 'binding' -->
-  </xsl:template>
-
-  <xsl:template match="//javaee:property" >
-    <xsl:element name="property" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:property-name" >
-    <xsl:element name="property-name" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:property-class" >
-    <xsl:element name="property-class" >
-      <!-- eliminate generics for 1.4-based classes in JSF 1.1 -->
-      <xsl:choose>
-        <xsl:when test="contains(text(), '&lt;')" >
-          <xsl:value-of select="substring-before(text(), '&lt;')" />
-        </xsl:when>
-        <xsl:otherwise>
-          <xsl:value-of select="text()" />
-        </xsl:otherwise>
-      </xsl:choose>
-    </xsl:element>
-  </xsl:template>
-  
-  <xsl:template match="//javaee:property-extension[mfp:property-values|mfp:group|mfp:translatable|mfp:property-editor|mfp:expert|mfp:unsupported-agents|*[namespace-uri() != 'http://java.sun.com/xml/ns/javaee' and namespace-uri() !='http://myfaces.apache.org/maven-faces-plugin']]" >
-    <xsl:element name="property-extension" >
-      <xsl:element name="property-metadata" >
-        <xsl:apply-templates/>
-      </xsl:element>
-    </xsl:element>
-  </xsl:template>
-  
-  <xsl:template match="//javaee:property-extension[mfp:property-metadata]" priority="1" >
-    <xsl:element name="property-extension" >
-      <!-- do not copy the property values, but instead let them be picked up in the property-metadata element -->
-      <xsl:apply-templates select="*[name() != 'mfp:property-values']" />
-    </xsl:element>
-  </xsl:template>
-  
-  <xsl:template match="//mfp:property-metadata" >
-    <xsl:element name="property-metadata" >
-      <xsl:apply-templates/>
-      <!-- pick up any property-values elements from the parent node -->
-      <xsl:apply-templates select="../mfp:property-values" />
-    </xsl:element>
-  </xsl:template>
-
-  <!-- this templates grabs the component-family from an ancestor -->
-  <xsl:template match="//javaee:component-extension[mfp:component-supertype]" priority="1" >
-    <xsl:variable name="componentSupertype"
-                  select="mfp:component-supertype/text()" />
-    <xsl:element name="component-extension" >
-      <xsl:element name="component-family">
-        <xsl:value-of select="key('component-type', $componentSupertype)/javaee:component-extension/mfp:component-family/text()" />
-      </xsl:element>
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-  
-  <xsl:template match="//javaee:component-extension[mfp:component-family]" priority="2" >
-    <xsl:element name="component-extension" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:component-extension" >
-    <xsl:comment>Warning: this component has no component-family!</xsl:comment>
-    <xsl:element name="component-extension" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:component-metadata" >
-    <xsl:element name="component-metadata" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:converter" >
-    <xsl:element name="converter" >
-      <!-- xsl:apply-templates/ TODO use this instead -->
-      <xsl:apply-templates select="javaee:description"/>
-      <xsl:apply-templates select="javaee:display-name"/>
-      <xsl:apply-templates select="javaee:converter-id"/>
-      <xsl:apply-templates select="javaee:converter-for-class"/>
-      <xsl:apply-templates select="javaee:converter-class"/>
-      <xsl:apply-templates select="javaee:property"/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:converter-id" >
-    <xsl:element name="converter-id" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:converter-for-class" >
-    <xsl:element name="converter-for-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:converter-class" >
-    <xsl:element name="converter-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:managed-bean" >
-    <xsl:element name="managed-bean" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:managed-bean-name" >
-    <xsl:element name="managed-bean-name" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:managed-bean-class" >
-    <xsl:element name="managed-bean-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:managed-bean-scope" >
-    <xsl:element name="managed-bean-scope" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:managed-property" >
-    <xsl:element name="managed-property" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:null-value" >
-    <xsl:element name="null-value" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:value" >
-    <xsl:element name="value" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:map-entries" >
-    <xsl:element name="map-entries" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:map-entry" >
-    <xsl:element name="map-entry" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:key" >
-    <xsl:element name="key" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:key-class" >
-    <xsl:element name="key-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:value-class" >
-    <xsl:element name="value-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:message-bundle" >
-    <xsl:element name="message-bundle" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:list-entries" >
-    <xsl:element name="list-entries" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:navigation-rule" >
-    <xsl:element name="navigation-rule" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:from-view-id" >
-    <xsl:element name="from-view-id" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:navigation-case" >
-    <xsl:element name="navigation-case" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:from-action" >
-    <xsl:element name="from-action" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:from-outcome" >
-    <xsl:element name="from-outcome" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:to-view-id" >
-    <xsl:element name="to-view-id" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:redirect" >
-    <xsl:element name="redirect" />
-  </xsl:template>
-
-  <xsl:template match="//javaee:referenced-bean" >
-    <xsl:element name="referenced-bean" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:referenced-bean-name" >
-    <xsl:element name="referenced-bean-name" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:referenced-bean-class" >
-    <xsl:element name="referenced-bean-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:render-kit" >
-    <xsl:element name="render-kit" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:render-kit-id" >
-    <xsl:element name="render-kit-id" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:render-kit-class" >
-    <xsl:element name="render-kit-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-<!-- TODO: flatten component properties into renderer as attributes -->
-<!--
-  <xsl:template match="//javaee:renderer[javaee:renderer-extension/mfp:component-type]"
-                priority="1" >
-    <xsl:element name="renderer" >
-      <xsl:apply-templates select="javaee:component-family" />
-      <xsl:apply-templates select="javaee:renderer-type" />
-      <xsl:apply-templates select="javaee:renderer-class" />
-      <xsl:variable name="componentType" select="javaee:renderer-extension/mfp:component-type/text()" />
-      <xsl:for-each select="key('component-type', $componentType)/javaee:property" >
-        <xsl:element name="attribute" >
-          <xsl:apply-templates select="javaee:description" />
-          <xsl:apply-templates select="javaee:display-name" />
-          <xsl:apply-templates select="javaee:icon" />
-          <xsl:element name="attribute-name" >
-            <xsl:value-of select="javaee:property-name" />
-          </xsl:element>
-          <xsl:element name="attribute-class" >
-            <xsl:value-of select="javaee:property-class" />
-          </xsl:element>
-          <xsl:apply-templates select="javaee:default-value" />
-          <xsl:apply-templates select="javaee:suggested-value" />
-          <xsl:element name="attribute-extension" >
-            <xsl:apply-templates select="mfp:property-extension/*" />
-          </xsl:element>
-        </xsl:element>
-      </xsl:for-each>
-      <xsl:apply-templates select="javaee:attribute" />
-      <xsl:apply-templates select="javaee:renderer-extension" />
-    </xsl:element>
-  </xsl:template>
--->
-
-  <xsl:template match="//javaee:renderer" >
-    <xsl:element name="renderer" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:component-family" >
-    <xsl:element name="component-family" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:renderer-type" >
-    <xsl:element name="renderer-type" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:renderer-class" >
-    <xsl:element name="renderer-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:renderer-extension[mfp:unsupported-agents]" >
-    <xsl:element name="renderer-extension" >
-      <xsl:element name="renderer-metadata" >
-        <xsl:apply-templates/>
-      </xsl:element>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:lifecycle" >
-    <xsl:element name="lifecycle" >
-      <xsl:apply-templates select="javaee:phase-listener[contains(text(), $packageContains)]" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:phase-listener" >
-    <xsl:element name="phase-listener" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:default-locale" >
-    <xsl:element name="default-locale" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:supported-locale" >
-    <xsl:element name="supported-locale" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:validator" >
-    <xsl:element name="validator" >
-      <!-- xsl:apply-templates/ TODO use this instead -->
-      <xsl:apply-templates select="javaee:display-name"/>
-      <xsl:apply-templates select="javaee:validator-id"/>
-      <xsl:apply-templates select="javaee:validator-class"/>
-      <xsl:apply-templates select="javaee:property"/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:validator-id" >
-    <xsl:element name="validator-id" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:validator-class" >
-    <xsl:element name="validator-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:description" >
-    <xsl:element name="description" >
-      <xsl:apply-templates select="@*" />
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:property[javaee:property-extension/mfp:long-description]/javaee:description" priority="1">
-    <xsl:element name="description" >
-      <xsl:apply-templates select="../javaee:property-extension/mfp:long-description/@*" />
-      <xsl:value-of select="../javaee:property-extension/mfp:long-description/text()" />
-    </xsl:element>
-  </xsl:template>
-
-
-  <xsl:template match="//javaee:description/@xml:lang" >
-    <xsl:attribute name="xml:lang" ><xsl:value-of select="@xml:lang" /></xsl:attribute>
-  </xsl:template>
-
-  <xsl:template match="//javaee:display-name" >
-    <xsl:element name="display-name" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:icon" >
-    <xsl:element name="icon" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:small-icon" >
-    <xsl:element name="small-icon" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:large-icon" >
-    <xsl:element name="large-icon" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:default-value" >
-    <xsl:element name="default-value" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:suggested-value" >
-    <xsl:element name="suggested-value" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:component-family" >
-    <xsl:element name="component-family" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:favorite-property" >
-    <xsl:element name="favorite-property" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:renderer-type" >
-    <xsl:element name="renderer-type" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:property-values" >
-    <xsl:element name="attribute-values" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:unsupported-agents" >
-    <xsl:element name="unsupported-agents" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <!-- Handle metadata we do not know about by letting it through.  Currently,
-   just for property-extension and component-metadata, but should be global.
-   See JIRA issues ADFFACES-358, ADFFACES-361 and ADFFACES-472 -->
-  <xsl:template match="javaee:property-extension/*[namespace-uri() != 'http://java.sun.com/xml/ns/javaee' and namespace-uri() !='http://myfaces.apache.org/maven-faces-plugin']">
-    <xsl:copy>
-      <xsl:apply-templates select="@*|node()"/>
-      <xsl:value-of select="text()"/>
-    </xsl:copy> 
-  </xsl:template>
-
-  <xsl:template match="mfp:component-metadata/*[namespace-uri() != 'http://java.sun.com/xml/ns/javaee' and namespace-uri() !='http://myfaces.apache.org/maven-faces-plugin']">
-    <xsl:copy>
-      <xsl:apply-templates select="@*|node()"/>
-      <xsl:value-of select="text()"/>
-    </xsl:copy> 
-  </xsl:template>
-
-
-  <xsl:template match="//mfp:component-metadata/mfp:group" >
-<!-- Disable component groups for now
-    <xsl:element name="group" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
--->
-  </xsl:template>
-
-  <xsl:template match="//mfp:property-metadata/mfp:group" >
-    <xsl:element name="group" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:property-metadata/mfp:translatable" >
-    <xsl:element name="translatable" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-  
-  <xsl:template match="//mfp:accepts-child-components" >
-    <xsl:element name="accepts-child-components" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-
-  <xsl:template match="//mfp:property-editor" >
-    <xsl:element name="property-editor" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:expert" >
-    <xsl:element name="expert" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:preferred-children" >
-    <xsl:element name="preferred-children" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:allowable-children" >
-    <xsl:element name="allowable-children" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:preferred" >
-    <xsl:element name="preferred" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:deprecated" >
-    <xsl:element name="deprecated" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:initial-value" >
-    <xsl:element name="initial-value" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-</xsl:stylesheet>
diff --git a/maven2-plugins/myfaces-faces-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/faces/resources/transform12.xsl b/maven2-plugins/myfaces-faces-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/faces/resources/transform12.xsl
deleted file mode 100644
index 70916ef..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/faces/resources/transform12.xsl
+++ /dev/null
@@ -1,905 +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.
-	   
--->
-<xsl:stylesheet xmlns="http://java.sun.com/xml/ns/javaee"
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
-                xmlns:xs="http://www.w3.org/2001/XMLSchema"
-                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-                xmlns:javaee="http://java.sun.com/xml/ns/javaee"
-                xmlns:mfp="http://myfaces.apache.org/maven-faces-plugin" 
-                exclude-result-prefixes="xsl xs javaee mfp"
-                version="1.0" >
-
-  <xsl:output method="xml" indent="yes"/>
-  <xsl:param name="packageContains" />
-  <xsl:param name="converterPackageContains" />
-  <xsl:param name="validatorPackageContains" />
-  <xsl:param name="typePrefix" />
-  <xsl:param name="removeRenderers" />
-
-
-
-  <xsl:key name="component-type" 
-           match="javaee:component" 
-           use="javaee:component-type/text()" />
-
-  <xsl:key name="render-kit-id" 
-           match="javaee:render-kit" 
-           use="javaee:render-kit-id/text()" />
-
-  <!-- switch off default text processing -->  
-  <xsl:template match="//text()" />
-
-  <xsl:template match="/javaee:faces-config" >
-    <xsl:element name="faces-config"
-                 namespace="http://java.sun.com/xml/ns/javaee" >
-      <xsl:attribute name="xsi:schemaLocation">http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd</xsl:attribute>
-      <xsl:attribute name="version">1.2</xsl:attribute>
-      <xsl:apply-templates select="javaee:application" />
-      <xsl:apply-templates select="javaee:factory" />
-      <xsl:apply-templates select="javaee:component[not(contains(javaee:component-extension/mfp:component-class-modifier/text(), 'abstract')) and
-                                                    starts-with(javaee:component-type, $typePrefix)]" />
-      <xsl:apply-templates select="javaee:converter[contains(javaee:converter-class, $converterPackageContains)]" />
-      <xsl:apply-templates select="javaee:managed-bean[contains(javaee:managed-bean-class, $packageContains)]" />
-      <xsl:apply-templates select="javaee:navigation-rule" />
-      <xsl:apply-templates select="javaee:referenced-bean" />
-      <!-- merge the render-kits together -->
-      <xsl:for-each select="javaee:render-kit[contains(javaee:render-kit-class, $packageContains)]" >
-        <xsl:element name="render-kit" >
-          <xsl:apply-templates select="javaee:description" />
-          <xsl:apply-templates select="javaee:display-name" />
-          <xsl:apply-templates select="javaee:icon" />
-          <xsl:apply-templates select="javaee:render-kit-id" />
-          <xsl:apply-templates select="javaee:render-kit-class" />
-          <!-- Drop renderers if desired -->
-          <xsl:if test="$removeRenderers != 'true'">
-            <xsl:for-each select="key('render-kit-id', javaee:render-kit-id/text())" >
-              <xsl:apply-templates select="javaee:renderer[contains(javaee:renderer-class, $packageContains)]" />
-            </xsl:for-each>
-          </xsl:if>
-        </xsl:element>
-      </xsl:for-each>
-      <xsl:apply-templates select="javaee:lifecycle[contains(javaee:phase-listener, $packageContains)]" />
-      <xsl:apply-templates select="javaee:validator[contains(javaee:validator-class, $validatorPackageContains)]" />
-    </xsl:element>
-  </xsl:template>
-
-  <!-- this templates applies javaee:property templates
-       for a component and all supertypes -->
-  <xsl:template name="apply-property-templates" >
-    <xsl:param name="component" />
-    <xsl:variable name="componentSupertype"
-                  select="$component/javaee:component-extension/mfp:component-supertype/text()" />
-    <xsl:if test="$componentSupertype" >
-      <xsl:call-template name="apply-property-templates" >
-        <xsl:with-param name="component" 
-                        select="key('component-type', $componentSupertype)" />
-      </xsl:call-template>
-    </xsl:if>
-    <xsl:apply-templates select="$component/javaee:property" />
-  </xsl:template>
-  
-  <!-- this templates applies javaee:attribute templates
-       for a component and all supertypes -->
-  <xsl:template name="apply-attribute-templates" >
-    <xsl:param name="component" />
-    <xsl:variable name="componentSupertype"
-                  select="$component/javaee:component-extension/mfp:component-supertype/text()" />
-    <xsl:if test="$componentSupertype" >
-      <xsl:call-template name="apply-attribute-templates" >
-        <xsl:with-param name="component"
-                        select="key('component-type', $componentSupertype)" />
-      </xsl:call-template>
-    </xsl:if>
-    <xsl:apply-templates select="$component/javaee:attribute" />
-  </xsl:template>
-  
-  <!-- this templates applies javaee:facet templates
-       for a component and all supertypes -->
-  <xsl:template name="apply-facet-templates" >
-    <xsl:param name="component" />
-    <xsl:variable name="componentSupertype"
-                  select="$component/javaee:component-extension/mfp:component-supertype/text()" />
-    <xsl:if test="$componentSupertype" >
-      <xsl:call-template name="apply-facet-templates" >
-        <xsl:with-param name="component"
-                        select="key('component-type', $componentSupertype)" />
-      </xsl:call-template>
-    </xsl:if>
-    <xsl:apply-templates select="$component/javaee:facet" />
-  </xsl:template>
-  
-  <xsl:template match="//javaee:component[javaee:component-extension/mfp:component-supertype]" 
-                priority="1" >
-    <xsl:element name="component" >
-      <xsl:apply-templates select="javaee:description" />
-      <xsl:apply-templates select="javaee:display-name" />
-      <xsl:apply-templates select="javaee:icon" />
-      <xsl:apply-templates select="javaee:component-type" />
-      <xsl:apply-templates select="javaee:component-class" />
-      <xsl:call-template name="apply-facet-templates" >
-        <xsl:with-param name="component" select="." />
-      </xsl:call-template>
-      <xsl:call-template name="apply-attribute-templates" >
-        <xsl:with-param name="component" select="." />
-      </xsl:call-template>
-      <xsl:call-template name="apply-property-templates" >
-        <xsl:with-param name="component" select="." />
-      </xsl:call-template>
-      <xsl:apply-templates select="javaee:component-extension" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:application" >
-    <xsl:element name="application" >
-      <xsl:apply-templates select="javaee:action-listener[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:default-render-kit-id" />
-      <xsl:apply-templates select="javaee:message-bundle[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:view-handler[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:state-manager[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:navigation-handler[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:el-resolver[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:property-resolver[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:variable-resolver[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:locale-config" />
-      <xsl:apply-templates select="javaee:resource-bundle" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:action-listener" >
-    <xsl:element name="action-listener" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:default-render-kit-id" >
-    <xsl:element name="default-render-kit-id" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:message-bundle" >
-    <xsl:element name="message-bundle" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:navigation-handler" >
-    <xsl:element name="navigation-handler" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:view-handler" >
-    <xsl:element name="view-handler" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:state-manager" >
-    <xsl:element name="state-manager" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:el-resolver" >
-    <xsl:element name="el-resolver" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:property-resolver" >
-    <xsl:element name="property-resolver" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:variable-resolver" >
-    <xsl:element name="variable-resolver" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:locale-config" >
-    <xsl:element name="locale-config" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:factory" >
-    <xsl:element name="factory" >
-      <xsl:apply-templates select="javaee:application-factory[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:faces-context-factory[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:lifecycle-factory[contains(text(), $packageContains)]" />
-      <xsl:apply-templates select="javaee:render-kit-factory[contains(text(), $packageContains)]" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:application-factory" >
-    <xsl:element name="application-factory" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:faces-context-factory" >
-    <xsl:element name="faces-context-factory" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:lifecycle-factory" >
-    <xsl:element name="lifecycle-factory" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:render-kit-factory" >
-    <xsl:element name="render-kit-factory" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:component" >
-    <xsl:element name="component" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:component-type" >
-    <xsl:element name="component-type" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:component-class" >
-    <xsl:element name="component-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:component/javaee:facet[1]" priority="1" >
-    <xsl:comment><xsl:value-of select="parent::node()/javaee:component-type/text()" /> facets</xsl:comment>
-    <xsl:element name="facet" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:facet" >
-    <xsl:element name="facet" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:facet-name" >
-    <xsl:element name="facet-name" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:facet-extension[mfp:facet-metadata|mfp:allowable-children|mfp:preferred-children|mfp:preferred|mfp:unsupported-agents|mfp:deprecated]" >
-    <xsl:element name="facet-extension" >
-      <xsl:element name="facet-metadata" >
-        <xsl:apply-templates/>
-      </xsl:element>
-    </xsl:element>
-  </xsl:template>
-
-  
-  <xsl:template match="//javaee:component/javaee:attribute[1]" priority="1" >
-    <xsl:comment><xsl:value-of select="parent::node()/javaee:component-type/text()" /> attributes</xsl:comment>
-    <xsl:element name="attribute" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:component/javaee:attribute[1]" priority="1" >
-    <xsl:comment><xsl:value-of select="parent::node()/javaee:component-type/text()" /> attributes</xsl:comment>
-    <xsl:element name="attribute" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:attribute" >
-    <xsl:element name="attribute" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:attribute-name" >
-    <xsl:element name="attribute-name" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:attribute-class" >
-    <xsl:element name="attribute-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:attribute-extension" >
-    <xsl:element name="attribute-extension" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:component/javaee:property[1]" priority="1" >
-    <xsl:comment><xsl:value-of select="parent::node()/javaee:component-type/text()" /> properties</xsl:comment>
-    <xsl:element name="property" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:property[javaee:property-name/text() = 'binding']" priority='2' >
-    <!-- skip over properties named 'binding' -->
-  </xsl:template>
-
-  <xsl:template match="//javaee:property" >
-    <xsl:element name="property" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:property-name" >
-    <xsl:element name="property-name" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:property-class" >
-    <xsl:element name="property-class" >
-      <!-- eliminate generics for 1.4-based classes in JSF 1.1 -->
-      <xsl:choose>
-        <xsl:when test="contains(text(), '&lt;')" >
-          <xsl:value-of select="substring-before(text(), '&lt;')" />
-        </xsl:when>
-        <xsl:otherwise>
-          <xsl:value-of select="text()" />
-        </xsl:otherwise>
-      </xsl:choose>
-    </xsl:element>
-  </xsl:template>
-  
-  <xsl:template match="//javaee:property-extension[mfp:property-values|mfp:group|mfp:translatable|mfp:property-editor|mfp:expert|mfp:unsupported-agents|*[namespace-uri() != 'http://java.sun.com/xml/ns/javaee' and namespace-uri() !='http://myfaces.apache.org/maven-faces-plugin']]" >
-    <xsl:element name="property-extension" >
-      <xsl:element name="property-metadata" >
-        <xsl:apply-templates/>
-      </xsl:element>
-    </xsl:element>
-  </xsl:template>
-  
-  <xsl:template match="//javaee:property-extension[mfp:property-metadata]" priority="1" >
-    <xsl:element name="property-extension" >
-      <!-- do not copy the property values, but instead let them be picked up in the property-metadata element -->
-      <xsl:apply-templates select="*[name() != 'mfp:property-values']" />
-    </xsl:element>
-  </xsl:template>
-  
-  <xsl:template match="//mfp:property-metadata" >
-    <xsl:element name="property-metadata" >
-      <xsl:apply-templates/>
-      <!-- pick up any property-values elements from the parent node -->
-      <xsl:apply-templates select="../mfp:property-values" />
-    </xsl:element>
-  </xsl:template>
-
-  <!-- this templates grabs the component-family from an ancestor -->
-  <xsl:template match="//javaee:component-extension[mfp:component-supertype]" priority="1" >
-    <xsl:variable name="componentSupertype"
-                  select="mfp:component-supertype/text()" />
-    <xsl:element name="component-extension" >
-      <xsl:element name="component-family">
-        <xsl:value-of select="key('component-type', $componentSupertype)/javaee:component-extension/mfp:component-family/text()" />
-      </xsl:element>
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-  
-  <xsl:template match="//javaee:component-extension[mfp:component-family]" priority="2" >
-    <xsl:element name="component-extension" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:component-extension" >
-    <xsl:comment>Warning: this component has no component-family!</xsl:comment>
-    <xsl:element name="component-extension" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:component-metadata" >
-    <xsl:element name="component-metadata" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:converter" >
-    <xsl:element name="converter" >
-      <!-- xsl:apply-templates/ TODO use this instead -->
-      <xsl:apply-templates select="javaee:description"/>
-      <xsl:apply-templates select="javaee:display-name"/>
-      <xsl:apply-templates select="javaee:converter-id"/>
-      <xsl:apply-templates select="javaee:converter-for-class"/>
-      <xsl:apply-templates select="javaee:converter-class"/>
-      <xsl:apply-templates select="javaee:property"/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:converter-id" >
-    <xsl:element name="converter-id" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:converter-for-class" >
-    <xsl:element name="converter-for-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:converter-class" >
-    <xsl:element name="converter-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:managed-bean" >
-    <xsl:element name="managed-bean" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:managed-bean-name" >
-    <xsl:element name="managed-bean-name" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:managed-bean-class" >
-    <xsl:element name="managed-bean-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:managed-bean-scope" >
-    <xsl:element name="managed-bean-scope" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:managed-property" >
-    <xsl:element name="managed-property" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:null-value" >
-    <xsl:element name="null-value" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:value" >
-    <xsl:element name="value" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:map-entries" >
-    <xsl:element name="map-entries" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:map-entry" >
-    <xsl:element name="map-entry" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:key" >
-    <xsl:element name="key" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:key-class" >
-    <xsl:element name="key-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:value-class" >
-    <xsl:element name="value-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:message-bundle" >
-    <xsl:element name="message-bundle" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:list-entries" >
-    <xsl:element name="list-entries" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:navigation-rule" >
-    <xsl:element name="navigation-rule" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:from-view-id" >
-    <xsl:element name="from-view-id" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:navigation-case" >
-    <xsl:element name="navigation-case" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:from-action" >
-    <xsl:element name="from-action" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:from-outcome" >
-    <xsl:element name="from-outcome" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:to-view-id" >
-    <xsl:element name="to-view-id" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:redirect" >
-    <xsl:element name="redirect" />
-  </xsl:template>
-
-  <xsl:template match="//javaee:referenced-bean" >
-    <xsl:element name="referenced-bean" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:referenced-bean-name" >
-    <xsl:element name="referenced-bean-name" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:referenced-bean-class" >
-    <xsl:element name="referenced-bean-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:render-kit" >
-    <xsl:element name="render-kit" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:render-kit-id" >
-    <xsl:element name="render-kit-id" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:render-kit-class" >
-    <xsl:element name="render-kit-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-<!-- TODO: flatten component properties into renderer as attributes -->
-<!--
-  <xsl:template match="//javaee:renderer[javaee:renderer-extension/mfp:component-type]"
-                priority="1" >
-    <xsl:element name="renderer" >
-      <xsl:apply-templates select="javaee:component-family" />
-      <xsl:apply-templates select="javaee:renderer-type" />
-      <xsl:apply-templates select="javaee:renderer-class" />
-      <xsl:variable name="componentType" select="javaee:renderer-extension/mfp:component-type/text()" />
-      <xsl:for-each select="key('component-type', $componentType)/javaee:property" >
-        <xsl:element name="attribute" >
-          <xsl:apply-templates select="javaee:description" />
-          <xsl:apply-templates select="javaee:display-name" />
-          <xsl:apply-templates select="javaee:icon" />
-          <xsl:element name="attribute-name" >
-            <xsl:value-of select="javaee:property-name" />
-          </xsl:element>
-          <xsl:element name="attribute-class" >
-            <xsl:value-of select="javaee:property-class" />
-          </xsl:element>
-          <xsl:apply-templates select="javaee:default-value" />
-          <xsl:apply-templates select="javaee:suggested-value" />
-          <xsl:element name="attribute-extension" >
-            <xsl:apply-templates select="mfp:property-extension/*" />
-          </xsl:element>
-        </xsl:element>
-      </xsl:for-each>
-      <xsl:apply-templates select="javaee:attribute" />
-      <xsl:apply-templates select="javaee:renderer-extension" />
-    </xsl:element>
-  </xsl:template>
--->
-
-  <xsl:template match="//javaee:renderer" >
-    <xsl:element name="renderer" >
-      <xsl:apply-templates />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:component-family" >
-    <xsl:element name="component-family" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:renderer-type" >
-    <xsl:element name="renderer-type" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:renderer-class" >
-    <xsl:element name="renderer-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:renderer-extension[mfp:unsupported-agents]" >
-    <xsl:element name="renderer-extension" >
-      <xsl:element name="renderer-metadata" >
-        <xsl:apply-templates/>
-      </xsl:element>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:lifecycle" >
-    <xsl:element name="lifecycle" >
-      <xsl:apply-templates select="javaee:phase-listener[contains(text(), $packageContains)]" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:phase-listener" >
-    <xsl:element name="phase-listener" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:default-locale" >
-    <xsl:element name="default-locale" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:supported-locale" >
-    <xsl:element name="supported-locale" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:validator" >
-    <xsl:element name="validator" >
-      <!-- xsl:apply-templates/ TODO use this instead -->
-      <xsl:apply-templates select="javaee:display-name"/>
-      <xsl:apply-templates select="javaee:validator-id"/>
-      <xsl:apply-templates select="javaee:validator-class"/>
-      <xsl:apply-templates select="javaee:property"/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:validator-id" >
-    <xsl:element name="validator-id" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:validator-class" >
-    <xsl:element name="validator-class" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:description" >
-    <xsl:element name="description" >
-      <xsl:apply-templates select="@*" />
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:property[javaee:property-extension/mfp:long-description]/javaee:description" priority="1">
-    <xsl:element name="description" >
-      <xsl:apply-templates select="../javaee:property-extension/mfp:long-description/@*" />
-      <xsl:value-of select="../javaee:property-extension/mfp:long-description/text()" />
-    </xsl:element>
-  </xsl:template>
-
-
-  <xsl:template match="//javaee:description/@xml:lang" >
-    <xsl:attribute name="xml:lang" ><xsl:value-of select="@xml:lang" /></xsl:attribute>
-  </xsl:template>
-
-  <xsl:template match="//javaee:display-name" >
-    <xsl:element name="display-name" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:icon" >
-    <xsl:element name="icon" >
-      <xsl:apply-templates/>
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:small-icon" >
-    <xsl:element name="small-icon" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:large-icon" >
-    <xsl:element name="large-icon" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:default-value" >
-    <xsl:element name="default-value" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//javaee:suggested-value" >
-    <xsl:element name="suggested-value" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:component-family" >
-    <xsl:element name="component-family" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:favorite-property" >
-    <xsl:element name="favorite-property" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:renderer-type" >
-    <xsl:element name="renderer-type" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:property-values" >
-    <xsl:element name="attribute-values" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:unsupported-agents" >
-    <xsl:element name="unsupported-agents" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <!-- Handle metadata we do not know about by letting it through.  Currently,
-   just for property-extension and component-metadata, but should be global.
-   See JIRA issues ADFFACES-358, ADFFACES-361 and ADFFACES-472 -->
-  <xsl:template match="javaee:property-extension/*[namespace-uri() != 'http://java.sun.com/xml/ns/javaee' and namespace-uri() !='http://myfaces.apache.org/maven-faces-plugin']">
-    <xsl:copy>
-      <xsl:apply-templates select="@*|node()"/>
-      <xsl:value-of select="text()"/>
-    </xsl:copy> 
-  </xsl:template>
-
-  <xsl:template match="mfp:component-metadata/*[namespace-uri() != 'http://java.sun.com/xml/ns/javaee' and namespace-uri() !='http://myfaces.apache.org/maven-faces-plugin']">
-    <xsl:copy>
-      <xsl:apply-templates select="@*|node()"/>
-      <xsl:value-of select="text()"/>
-    </xsl:copy> 
-  </xsl:template>
-
-  <xsl:template match="//mfp:component-metadata/mfp:group" >
-<!-- Disable component groups for now
-    <xsl:element name="group" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
--->
-  </xsl:template>
-
-  <xsl:template match="//mfp:property-metadata/mfp:group" >
-    <xsl:element name="group" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:property-metadata/mfp:translatable" >
-    <xsl:element name="translatable" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-  <xsl:template match="//mfp:accepts-child-components" >
-    <xsl:element name="accepts-child-components" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-
-  <xsl:template match="//mfp:property-editor" >
-    <xsl:element name="property-editor" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:expert" >
-    <xsl:element name="expert" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:preferred-children" >
-    <xsl:element name="preferred-children" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:allowable-children" >
-    <xsl:element name="allowable-children" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:preferred" >
-    <xsl:element name="preferred" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:deprecated" >
-    <xsl:element name="deprecated" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-  <xsl:template match="//mfp:initial-value" >
-    <xsl:element name="initial-value" >
-      <xsl:value-of select="text()" />
-    </xsl:element>
-  </xsl:template>
-
-</xsl:stylesheet>
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/conf/META-INF/faces-config.xml b/maven2-plugins/myfaces-faces-plugin/src/test/conf/META-INF/faces-config.xml
deleted file mode 100644
index 7da0454..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/conf/META-INF/faces-config.xml
+++ /dev/null
@@ -1,181 +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.
-	   
--->
-  <application>
-    <view-handler>org.apache.myfaces.trinidadinternal.application.ViewHandlerImpl</view-handler>
-    <state-manager>org.apache.myfaces.trinidadinternal.application.StateManagerImpl</state-manager>
-    <navigation-handler>org.apache.myfaces.trinidadinternal.application.NavigationHandlerImpl</navigation-handler>
-    <variable-resolver>org.apache.myfaces.trinidadinternal.el.TrinidadVariableResolver</variable-resolver>
-  </application>
-
-  <lifecycle>
-    <phase-listener>org.apache.myfaces.trinidadinternal.context.TrinidadPhaseListener</phase-listener>
-  </lifecycle>
-
-  <converter>
-    <converter-id>javax.faces.Short</converter-id>
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.ShortConverter</converter-class>
-  </converter>     
-  <converter>
-    <converter-for-class>java.lang.Short</converter-for-class>
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.ShortConverter</converter-class>
-  </converter>
-  
-  <converter>
-    <converter-id>javax.faces.Byte</converter-id>
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.ByteConverter</converter-class>
-  </converter>     
-  <converter>
-    <converter-for-class>java.lang.Byte</converter-for-class>
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.ByteConverter</converter-class>
-  </converter>  
-
-  <converter>
-    <converter-id>javax.faces.Integer</converter-id>
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.IntegerConverter</converter-class>
-  </converter>     
-  <converter>
-    <converter-for-class>java.lang.Integer</converter-for-class>
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.IntegerConverter</converter-class>
-  </converter>
-  
-  <converter>
-    <converter-id>javax.faces.Long</converter-id>
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.LongConverter</converter-class>
-  </converter>     
-  <converter>
-    <converter-for-class>java.lang.Long</converter-for-class>
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.LongConverter</converter-class>
-  </converter>
-  
-  <converter>
-    <converter-id>javax.faces.Float</converter-id>
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.FloatConverter</converter-class>
-  </converter>     
-  <converter>
-    <converter-for-class>java.lang.Float</converter-for-class>
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.FloatConverter</converter-class>
-  </converter>  
-  
-  <converter>
-    <converter-id>javax.faces.Double</converter-id>
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.DoubleConverter</converter-class>
-  </converter>     
-  <converter>
-    <converter-for-class>java.lang.Double</converter-for-class>
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.DoubleConverter</converter-class>
-  </converter>        
-  
-  <validator>
-    <validator-id>javax.faces.LongRange</validator-id>
-    <validator-class>org.apache.myfaces.trinidadinternal.validator.LongRangeValidator</validator-class>
-  </validator>
-  
-  <validator>
-    <display-name>validateDateTimeRange</display-name>
-    <validator-id>org.apache.myfaces.trinidad.DateTimeRange</validator-id>
-    <validator-class>org.apache.myfaces.trinidad.validator.DateTimeRangeValidator</validator-class>   
-  </validator>
-
-  <validator>
-    <display-name>validateRegularExpression</display-name>
-    <validator-id>org.apache.myfaces.trinidad.RegExp</validator-id>
-    <validator-class>org.apache.myfaces.trinidadinternal.validator.RegExpValidator</validator-class>
-  </validator>
-
-  <validator>
-    <display-name>validateByteLength</display-name>
-    <validator-id>org.apache.myfaces.trinidad.ByteLength</validator-id>
-    <validator-class>org.apache.myfaces.trinidadinternal.validator.ByteLengthValidator</validator-class>   
-  </validator>
-
-   <converter>
-    <display-name>Color Converter</display-name>
-    <converter-id>org.apache.myfaces.trinidad.Color</converter-id>
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.ColorConverter</converter-class>
-  </converter>
-  
-  <converter>
-    <description>Color Converter</description>
-    <converter-for-class>java.awt.Color</converter-for-class>
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.ColorConverter</converter-class>
-  </converter>
-
-  <converter>
-    <display-name>Date Time Converter</display-name>
-    <converter-id>javax.faces.DateTime</converter-id>
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.DateTimeConverter</converter-class>
-  </converter>
-
-  <converter>
-    <display-name>Date Time Converter</display-name>
-    <converter-id>org.apache.myfaces.trinidad.DateTime</converter-id>    
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.DateTimeConverter</converter-class>
-  </converter>
-  
-  <converter>
-    <display-name>Date Time Converter</display-name>
-    <converter-for-class>java.util.Date</converter-for-class>   
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.DateTimeConverter</converter-class>
-  </converter>
-  
-  <converter>
-    <display-name>Date Time Converter</display-name>
-    <converter-for-class>java.sql.Timestamp</converter-for-class>   
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.TimestampConverter</converter-class>
-  </converter>
-
-  <converter>
-    <display-name>Date Time Converter</display-name>
-    <converter-for-class>java.sql.Date</converter-for-class>   
-    <converter-class>org.apache.myfaces.trinidadinternal.convert.JavaSqlDateConverter</converter-class>
-  </converter>
-
-  <converter>
-    <display-name>Number Converter</display-name>
-    <converter-for-class>java.lang.Number</converter-for-class>   
-    <converter-class>org.apache.myfaces.trinidad.convert.NumberConverter</converter-class>
-  </converter>
-
-  <converter>
-    <display-name>Number Converter</display-name>
-    <converter-id>javax.faces.Number</converter-id>
-    <converter-class>org.apache.myfaces.trinidad.convert.NumberConverter</converter-class>
-  </converter>
-  
-  <converter>
-    <display-name>Number Converter</display-name>
-    <converter-id>org.apache.myfaces.trinidad.Number</converter-id> 
-    <converter-class>org.apache.myfaces.trinidad.convert.NumberConverter</converter-class>
-  </converter>
-  
-  <referenced-bean>
-    <description>implicit object provided by Trinidad</description>
-    <display-name>Request Context</display-name>
-    <referenced-bean-name>requestContext</referenced-bean-name>
-    <referenced-bean-class>org.apache.myfaces.trinidad.context.RequestContext</referenced-bean-class>
-  </referenced-bean>
-
-  <referenced-bean>
-    <description>Trinidad Process Scope Map</description>
-    <display-name>Process Scope</display-name>
-    <referenced-bean-name>processScope</referenced-bean-name>
-    <referenced-bean-class>java.util.Map</referenced-bean-class>
-  </referenced-bean>
-
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/java-templates/org/apache/myfaces/trinidad/component/UIXCommandTemplate.java b/maven2-plugins/myfaces-faces-plugin/src/test/java-templates/org/apache/myfaces/trinidad/component/UIXCommandTemplate.java
deleted file mode 100644
index 26b9f00..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/java-templates/org/apache/myfaces/trinidad/component/UIXCommandTemplate.java
+++ /dev/null
@@ -1,154 +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.
- */
-package org.apache.myfaces.trinidad.component;
-
-import javax.faces.component.ActionSource;
-import javax.faces.context.FacesContext;
-import javax.faces.el.MethodBinding;
-import javax.faces.event.AbortProcessingException;
-import javax.faces.event.ActionEvent;
-import javax.faces.event.ActionListener;
-import javax.faces.event.FacesEvent;
-import javax.faces.event.PhaseId;
-
-import org.apache.myfaces.trinidad.context.RequestContext;
-import org.apache.myfaces.trinidad.event.LaunchEvent;
-import org.apache.myfaces.trinidad.event.LaunchListener;
-import org.apache.myfaces.trinidad.event.ReturnEvent;
-import org.apache.myfaces.trinidad.event.ReturnListener;
-
-/**
- * Base class for command components.
- *
- * @version $Name:  $ ($Revision: 1.3 $) $Date: 2004/07/19 18:25:17 $
- */
-abstract public class UIXCommandTemplate extends UIXComponentBase
-                                  implements ActionSource, DialogSource
-{
-/**/ // Abstract methods implemented by code gen
-/**/  abstract public MethodBinding getActionListener();
-/**/  abstract public MethodBinding getReturnListener();
-/**/  abstract public MethodBinding getLaunchListener();
-
-
-  /**
-   * Add a LaunchListener.
-   */
-  public void addLaunchListener(LaunchListener listener)
-  {
-    addFacesListener(listener);
-  }
-
-  /**
-   * Remove a LaunchListener.
-   */
-  public void removeLaunchListener(LaunchListener listener)
-  {
-    removeFacesListener(listener);
-  }
-
-  /**
-   * Launch all added LaunchListeners.
-   */
-  public LaunchListener[] getLaunchListeners()
-  {
-    return (LaunchListener[]) getFacesListeners(LaunchListener.class);
-  }
-
-  /**
-   * <p>Intercept <code>queueEvent</code> and mark the phaseId for the
-   * event to be <code>PhaseId.APPLY_REQUEST_VALUES</code> if the
-   * <code>immediate</code> flag is true,
-   * <code>PhaseId.INVOKE_APPLICATION</code> otherwise.</p>
-   */
-  public void queueEvent(FacesEvent e)
-  {
-    if (e instanceof ActionEvent)
-    {
-      if (isImmediate())
-      {
-        e.setPhaseId(PhaseId.ANY_PHASE);
-      }
-      else
-      {
-        e.setPhaseId(PhaseId.INVOKE_APPLICATION);
-      }
-    }
-
-    super.queueEvent(e);
-  }
-
-
-  public void broadcast(FacesEvent event) throws AbortProcessingException
-  {
-    // Perform special processing for ActionEvents:  tell
-    // the RequestContext to remember this command instance
-    // so that the NavigationHandler can locate us to queue
-    // a LaunchEvent.
-    if (event instanceof ActionEvent)
-    {
-      RequestContext afContext = RequestContext.getCurrentInstance();
-      afContext.getDialogService().setCurrentLaunchSource(this);
-
-      try
-      {
-        // Perform standard superclass processing
-        super.broadcast(event);
-
-        // Notify the specified action listener method (if any),
-        // and the default action listener
-        __broadcast(event, getActionListener());
-
-        FacesContext context = getFacesContext();
-        ActionListener defaultActionListener =
-          context.getApplication().getActionListener();
-        if (defaultActionListener != null)
-        {
-          defaultActionListener.processAction((ActionEvent) event);
-        }
-      }
-      finally
-      {
-        afContext.getDialogService().setCurrentLaunchSource(null);
-      }
-    }
-    else
-    {
-      // Perform standard superclass processing
-      super.broadcast(event);
-
-      if (event instanceof LaunchEvent)
-      {
-        __broadcast(event, getLaunchListener());
-        boolean useWindow =
-          Boolean.TRUE.equals(getAttributes().get("useWindow"));
-
-        ((LaunchEvent) event).launchDialog(useWindow);
-      }
-      else if (event instanceof ReturnEvent)
-      {
-        __broadcast(event, getReturnListener());
-        // =-=AEW: always jump to render response???  Seems the safest
-        // option, because we don't want to immediately update a model
-        // or really perform any validation.
-        getFacesContext().renderResponse();
-      }
-    }
-  }
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/faces/AbstractMojoTestCase.java b/maven2-plugins/myfaces-faces-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/faces/AbstractMojoTestCase.java
deleted file mode 100644
index 8ff75af..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/faces/AbstractMojoTestCase.java
+++ /dev/null
@@ -1,134 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces;
-
-import java.lang.reflect.Field;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import junit.framework.TestCase;
-
-import org.apache.maven.model.Model;
-import org.apache.maven.model.Build;
-import org.apache.maven.plugin.Mojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-
-/**
- * Tests the component generation mojo.
- */
-abstract public class AbstractMojoTestCase extends TestCase
-{
-  /**
-   * Creates a new AbstractMojoTestCase.
-   *
-   * @param testName  the test to execute
-   */
-  public AbstractMojoTestCase(
-    String testName)
-  {
-    super(testName);
-  }
-
-  protected void setMojoProject(
-    Mojo   mojo,
-    String name) throws MojoExecutionException
-  {
-    Model model = new Model();
-    Build build = new Build();
-    build.setOutputDirectory("target/test-build-output");
-    model.setBuild(build);
-    setMojoField(mojo, name, new MavenProject(model));
-  }
-
-  protected void setMojoField(
-    Mojo   mojo,
-    String name,
-    Object value) throws MojoExecutionException
-  {
-    try
-    {
-      Class mojoClass = mojo.getClass();
-      Field field = mojoClass.getDeclaredField(name);
-      field.setAccessible(true);
-      field.set(mojo, value);
-    }
-    catch (NoSuchFieldException e)
-    {
-      throw new MojoExecutionException("Unknown Mojo property " +
-                                       "\"" + name + "\"", e);
-    }
-    catch (IllegalAccessException e)
-    {
-      throw new MojoExecutionException("Error setting Mojo property " +
-                                       "\"" + name + "\"", e);
-    }
-  }
-
-  protected void setMojoProperty(
-    Mojo   mojo,
-    String name,
-    Object value) throws MojoExecutionException
-  {
-    setMojoProperty(mojo, name, value.getClass(), value);
-  }
-
-  protected void setMojoProperty(
-    Mojo    mojo,
-    String  name,
-    boolean value) throws MojoExecutionException
-  {
-    setMojoProperty(mojo, name, Boolean.TYPE, Boolean.valueOf(value));
-  }
-
-  protected void setMojoProperty(
-    Mojo   mojo,
-    String name,
-    Class  type,
-    Object value) throws MojoExecutionException
-  {
-    try
-    {
-      Class mojoClass = mojo.getClass();
-      Method method = mojoClass.getDeclaredMethod(
-                                    "set" +
-                                    Character.toUpperCase(name.charAt(0)) +
-                                    name.substring(1),
-                                    new Class[]{type});
-      method.setAccessible(true);
-      method.invoke(mojo, new Object[]{value});
-    }
-    catch (NoSuchMethodException e)
-    {
-      throw new MojoExecutionException("Unknown Mojo property " +
-                                       "\"" + name + "\"", e);
-    }
-    catch (InvocationTargetException e)
-    {
-      throw new MojoExecutionException("Error setting Mojo property " +
-                                       "\"" + name + "\"",
-                                       e.getTargetException());
-    }
-    catch (IllegalAccessException e)
-    {
-      throw new MojoExecutionException("Error setting Mojo property " +
-                                       "\"" + name + "\"", e);
-    }
-  }
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateComponentsMojoTest.java b/maven2-plugins/myfaces-faces-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateComponentsMojoTest.java
deleted file mode 100644
index b82216b..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateComponentsMojoTest.java
+++ /dev/null
@@ -1,115 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces;
-
-import java.io.File;
-
-import org.apache.maven.plugin.Mojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.AbstractMojoTestCase;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.GenerateComponentsMojo;
-
-/**
- * Tests the component generation mojo.
- */
-public class GenerateComponentsMojoTest extends AbstractMojoTestCase
-{
-  /**
-   * Creates a new GenerateComponentsMojoTest.
-   *
-   * @param testName  the test to execute
-   */
-  public GenerateComponentsMojoTest(
-    String testName)
-  {
-    super(testName);
-  }
-
-  public void setUp() throws MojoExecutionException
-  {
-    Mojo mojo = new GenerateComponentsMojo();
-    File genSrcDir = new File("target/mojo-test-output/java");
-
-    setMojoProject(mojo, "project");
-    setMojoField(mojo, "packageContains", "org");
-    setMojoField(mojo, "typePrefix", "org.apache");
-    setMojoField(mojo, "templateSourceDirectory",
-                           new File("src/test/java-templates"));
-    setMojoField(mojo, "generatedSourceDirectory", genSrcDir);
-    setMojoField(mojo, "force", Boolean.TRUE);
-
-    _mojo = mojo;
-    _genSrcDir = genSrcDir;
-  }
-
-  public void tearDown()
-  {
-    _mojo = null;
-    _genSrcDir = null;
-  }
-
-    public void testMissingDefaultIndex() throws MojoExecutionException, MojoFailureException
-  {
-    _mojo.execute();
-  }
-/*
-  public void testSkipAPI() throws MojoExecutionException
-  {
-    setMojoField(_mojo, "resourcePath",
-                           "META-INF/maven-faces-plugin/testSkipAPI.lst");
-    _mojo.execute();
-
-    File targetFile = new File(_genSrcDir,
-                               "javax/faces/component/UINamingContainer.java");
-    if (targetFile.exists())
-      fail("JavaServer Faces API component generated");
-  }
-*/
-  public void testGenerate() throws MojoExecutionException, MojoFailureException
-  {
-    setMojoField(_mojo, "resourcePath",
-                        "META-INF/maven-faces-plugin/testGenerate.lst");
-    _mojo.execute();
-
-    File targetFile = new File(_genSrcDir,
-                               "org/apache/myfaces/trinidad/component/UIXCommand.java");
-    if (!targetFile.exists())
-      fail("Component not generated");
-
-    // TODO: verify identity content with trinidad Faces example
-  }
-
-  public void testGenerateWithTemplate() throws MojoExecutionException, MojoFailureException
-  {
-    setMojoField(_mojo, "resourcePath",
-                           "META-INF/maven-faces-plugin/testGenerate.lst");
-    _mojo.execute();
-
-    File targetFile = new File(_genSrcDir,
-                               "org/apache/myfaces/trinidad/component/UIXCommand.java");
-    if (!targetFile.exists())
-      fail("Component not generated");
-
-    // TODO: verify identity content with trinidad Faces example
-  }
-
-  private Mojo _mojo;
-  private File _genSrcDir;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateFacesConfigMojoTest.java b/maven2-plugins/myfaces-faces-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateFacesConfigMojoTest.java
deleted file mode 100644
index 279a524..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/faces/GenerateFacesConfigMojoTest.java
+++ /dev/null
@@ -1,75 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.faces;
-
-import java.io.File;
-
-import org.apache.maven.plugin.Mojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.GenerateFacesConfigMojo;
-
-/**
- * Tests the faces-config.xml generation mojo.
- */
-public class GenerateFacesConfigMojoTest extends AbstractMojoTestCase
-{
-  /**
-   * Creates a new GenerateFacesConfigMojoTest.
-   *
-   * @param testName  the test to execute
-   */
-  public GenerateFacesConfigMojoTest(
-    String testName)
-  {
-    super(testName);
-  }
-
-  public void setUp() throws MojoExecutionException
-  {
-    Mojo mojo = new GenerateFacesConfigMojo();
-    File targetDir = new File("target/mojo-test-output/java");
-
-    setMojoProject(mojo, "project");
-    setMojoField(mojo, "configDirectory",
-                           new File("src/test/resources"));
-    setMojoField(mojo, "configPath", "META-INF/faces-config.xml");
-    setMojoField(mojo, "targetDirectory", targetDir);
-    setMojoField(mojo, "force", Boolean.TRUE);
-
-    _mojo = mojo;
-    _targetDir = targetDir;
-  }
-
-  public void tearDown()
-  {
-    _mojo = null;
-    _targetDir = null;
-  }
-
-    public void testGenerate() throws MojoExecutionException, MojoFailureException
-  {
-    _mojo.execute();
-
-    // TODO: verify content is correct! 
-  }
-
-  private Mojo _mojo;
-  private File _targetDir;
-}
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/javax/faces/Component.xml b/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/javax/faces/Component.xml
deleted file mode 100644
index efb02f7..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/javax/faces/Component.xml
+++ /dev/null
@@ -1,67 +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.
-	   
--->
-<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
-              xmlns:md="http://myfaces.apache.org/bali/xml/metadata"
-              xmlns:mfp="http://myfaces.apache.org/maven-faces-plugin" >
-
-  <component>  
-  
-    <component-type>javax.faces.Component</component-type>
-    <component-class>javax.faces.component.UIComponent</component-class>
-
-    <property>
-      <property-name>id</property-name>
-      <property-class>String</property-class>
-      <property-extension>
-        <mfp:literal-only>true</mfp:literal-only>
-      </property-extension>
-    </property>
-
-    <property>
-      <property-name>rendered</property-name>
-      <property-class>boolean</property-class>
-      <default-value>true</default-value>
-    </property>
-
-    <property>
-      <property-name>binding</property-name>
-      <property-class>javax.faces.el.ValueBinding</property-class>
-    </property>
-
-    <property>
-      <property-name>transient</property-name>
-      <property-class>boolean</property-class>
-      <property-extension>
-        <mfp:literal-only>true</mfp:literal-only>
-        <mfp:transient>true</mfp:transient>
-      </property-extension>
-    </property>
-
-    <property>
-      <property-name>rendererType</property-name>
-      <property-class>String</property-class>
-      <property-extension>
-        <mfp:literal-only>true</mfp:literal-only>
-      </property-extension>
-    </property>
-
-  </component>
-</faces-config>
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/javax/faces/ComponentBase.xml b/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/javax/faces/ComponentBase.xml
deleted file mode 100644
index 5ef1725..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/javax/faces/ComponentBase.xml
+++ /dev/null
@@ -1,37 +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.
-	   
--->
-<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
-              xmlns:md="http://myfaces.apache.org/bali/xml/metadata"
-              xmlns:mfp="http://myfaces.apache.org/maven-faces-plugin" >
-
-  <component>  
-  
-    <component-type>javax.faces.ComponentBase</component-type>
-    <component-class>javax.faces.component.UIComponentBase</component-class>
-
-    <component-extension>
-      <mfp:component>
-        <mfp:component-supertype>javax.faces.Component</mfp:component-supertype>
-      </mfp:component>
-    </component-extension>
-    
-  </component>
-</faces-config>
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/javax/faces/NamingContainer.xml b/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/javax/faces/NamingContainer.xml
deleted file mode 100644
index 789e4da..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/javax/faces/NamingContainer.xml
+++ /dev/null
@@ -1,41 +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.
-	   
--->
-<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
-              xmlns:mfp="http://myfaces.apache.org/maven-faces-plugin" >
-
-  <component>
-
-    <component-type>javax.faces.NamingContainer</component-type>
-    <component-class>javax.faces.component.UINamingContainer</component-class>
-    
-    <description>
-      A simple naming container.
-    </description>
-    
-    <component-extension>
-      <mfp:component-family>javax.faces.NamingContainer</mfp:component-family>
-      <mfp:naming-container>true</mfp:naming-container>
-      <mfp:ecmascript-class>component.UINamingContainer</mfp:ecmascript-class>
-    </component-extension>
-      
-  </component>
-
-</faces-config>
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/trinidad/faces/Command.xml b/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/trinidad/faces/Command.xml
deleted file mode 100644
index e8f9388..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/trinidad/faces/Command.xml
+++ /dev/null
@@ -1,143 +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.
-	   
--->
-<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
-              xmlns:af="http://myfaces.apache.org/trinidad"
-              xmlns:xi="http://www.w3.org/2001/XInclude"
-              xmlns:md="http://myfaces.apache.org/bali/xml/metadata"
-              xmlns:mfp="http://myfaces.apache.org/maven-faces-plugin" >
-
-  <component>  
-  
-    <component-type>org.apache.myfaces.trinidad.Command</component-type>
-    <component-class>org.apache.myfaces.trinidad.component.UIXCommand</component-class>
-
-    <description>
-      A base abstraction for components that implement ActionSource.
-    </description>
-
-    <xi:include href="TestInclude.xml" xpointer="/faces-config/component/*"></xi:include>
-
-    <property>
-      <property-name>action</property-name>
-      <property-class>javax.faces.el.MethodBinding</property-class>
-      <description>
-          The reference to the Java method that will be invoked when
-          an ActionEvent is broadcast by this component.  The method
-          signature takes zero parameters and may return String or void.
-          If a non-null String value is returned, it will be used as
-          an outcome for navigation.
-      </description>
-      <property-extension>
-        <mfp:state-holder>true</mfp:state-holder>
-        <mfp:method-binding-signature>
-          <mfp:return-type>String</mfp:return-type>
-        </mfp:method-binding-signature>
-        <md:attributeMetadata>
-          <md:preferred>true</md:preferred>
-        </md:attributeMetadata>
-      </property-extension>
-    </property>
-
-    <property>
-      <property-name>actionListener</property-name>
-      <property-class>javax.faces.el.MethodBinding</property-class>
-      <description>
-          The reference to the Java method that will be invoked when
-          an ActionEvent is broadcast by this component.  The method
-          signature takes a single ActionEvent parameter and returns
-          void.
-      </description>
-      <property-extension>
-        <mfp:state-holder>true</mfp:state-holder>
-        <mfp:method-binding-signature>
-          <mfp:parameter-type>javax.faces.event.ActionEvent</mfp:parameter-type>
-          <mfp:return-type>void</mfp:return-type>
-        </mfp:method-binding-signature>
-        <md:attributeMetadata>
-          <md:preferred>true</md:preferred>
-        </md:attributeMetadata>
-      </property-extension>
-    </property>
-
-    <property>
-      <property-name>returnListener</property-name>
-      <property-class>javax.faces.el.MethodBinding</property-class>
-      <description>
-          The reference to the Java method that will be invoked when
-          a dialog ReturnEvent is broadcast by this component.  The method
-          signature takes a single ReturnEvent parameter and returns
-          void.
-      </description>
-      <property-extension>
-        <mfp:state-holder>true</mfp:state-holder>
-        <mfp:method-binding-signature>
-          <mfp:parameter-type>org.apache.myfaces.trinidad.event.ReturnEvent</mfp:parameter-type>
-          <mfp:return-type>void</mfp:return-type>
-        </mfp:method-binding-signature>
-      </property-extension>
-    </property>
-
-    <property>
-      <property-name>immediate</property-name>
-      <property-class>boolean</property-class>
-      <description>
-        a reference to an action method sent by the command component, 
-or the static outcome of an action.  When immediate is true, the 
-default ActionListener provided by the JavaServer Faces implementation 
-should be executed during Apply Request Values phase of the request 
-processing lifecycle, rather than waiting until the Invoke Application 
-phase.
-      </description>
-      <property-extension>
-        <mfp:required>false</mfp:required>
-      </property-extension>
-    </property>
-
-    <component-extension>
-      <mfp:component-family>org.apache.myfaces.trinidad.Command</mfp:component-family>
-      <mfp:default-renderer-type>org.apache.myfaces.trinidad.Button</mfp:default-renderer-type>
-      <mfp:component-supertype>org.apache.myfaces.trinidad.ComponentBase</mfp:component-supertype>
-
-      <mfp:jsp-tag-class>org.apache.myfaces.trinidadinternal.taglib.UIXCommandTag</mfp:jsp-tag-class>
-      <mfp:jsp-tag-name>af:command</mfp:jsp-tag-name>
-
-      <mfp:event>
-        <mfp:event-type>javax.faces.Action</mfp:event-type>
-        <mfp:event-delivery-phases>Invoke Application,Apply Request Values</mfp:event-delivery-phases>
-      </mfp:event>
-
-      <mfp:event>
-        <mfp:event-type>org.apache.myfaces.trinidad.Launch</mfp:event-type>
-        <mfp:event-delivery-phases>Invoke Application,Apply Request Values</mfp:event-delivery-phases>
-      </mfp:event>
-
-      <mfp:event>
-        <mfp:event-type>org.apache.myfaces.trinidad.Return</mfp:event-type>
-        <mfp:event-delivery-phases>Apply Request Values</mfp:event-delivery-phases>
-      </mfp:event>
-
-      <md:elementMetadata>
-        <md:group>${md:getTranslatedString("PALETTE_INPUT")}</md:group>
-      </md:elementMetadata>
-    </component-extension>
-
-  </component>
-</faces-config>
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/trinidad/faces/ComponentBase.xml b/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/trinidad/faces/ComponentBase.xml
deleted file mode 100644
index fc41ec4..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/trinidad/faces/ComponentBase.xml
+++ /dev/null
@@ -1,59 +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.
-	   
--->
-<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
-              xmlns:md="http://myfaces.apache.org/bali/xml/metadata"
-              xmlns:mfp="http://myfaces.apache.org/maven-faces-plugin" >
-
-  <component>  
-  
-    <component-type>org.apache.myfaces.trinidad.ComponentBase</component-type>
-    <component-class>org.apache.myfaces.trinidad.component.UIXComponentBase</component-class>
-
-    <property>
-      <property-name>attributeChangeListener</property-name>
-      <property-class>javax.faces.el.MethodBinding</property-class>
-      <description>
-          The reference to the Java method that will be invoked when
-          an AttributeChangeEvent is broadcast by this component.  The 
-          method signature takes a single AttributeChangeEvent parameter 
-          and returns void.
-      </description>
-      <property-extension>
-        <mfp:state-holder>true</mfp:state-holder>
-        <mfp:method-binding-signature>
-          <mfp:parameter-type>org.apache.myfaces.trinidad.event.AttributeChangeEvent</mfp:parameter-type>
-          <mfp:return-type>void</mfp:return-type>
-        </mfp:method-binding-signature>
-      </property-extension>
-    </property>
-
-    <component-extension>
-      <mfp:component-supertype>javax.faces.Component</mfp:component-supertype>
-
-      <mfp:jsp-tag-class>org.apache.myfaces.trinidadinternal.taglib.UIXComponentTag</mfp:jsp-tag-class>
-      <mfp:event>
-        <mfp:event-type>org.apache.myfaces.trinidad.AttributeChange</mfp:event-type>
-        <mfp:event-delivery-phases>Invoke Application,Apply Request Values</mfp:event-delivery-phases>
-      </mfp:event>
-    </component-extension>
-
-  </component>
-</faces-config>
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/trinidad/faces/TestInclude.xml b/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/trinidad/faces/TestInclude.xml
deleted file mode 100644
index e56490a..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/components/trinidad/faces/TestInclude.xml
+++ /dev/null
@@ -1,41 +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.
-	   
--->
-<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
-              xmlns:af="http://myfaces.apache.org/trinidad"
-              xmlns:xi="http://www.w3.org/2001/XInclude"
-              xmlns:md="http://myfaces.apache.org/bali/xml/metadata"
-              xmlns:mfp="http://myfaces.apache.org/maven-faces-plugin" >
-
-  <component>  
-    <property>
-      <property-name>includedProperty</property-name>
-      <property-class>java.lang.String</property-class>
-      <description>
-          just a test.
-      </description>
-      <property-extension>
-        <md:attributeMetadata>
-          <md:preferred>true</md:preferred>
-        </md:attributeMetadata>
-      </property-extension>
-    </property>
-  </component>
-</faces-config>
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/events/javax/faces/Action.xml b/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/events/javax/faces/Action.xml
deleted file mode 100644
index 71e4055..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/events/javax/faces/Action.xml
+++ /dev/null
@@ -1,38 +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.
-	   
--->
-<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
-              xmlns:md="http://myfaces.apache.org/bali/xml/metadata"
-              xmlns:mfp="http://myfaces.apache.org/maven-faces-plugin" >
-  <faces-config-extension>
-    <mfp:event>
-      <mfp:description>
-        Event delivered when the "action" of the component has been
-invoked;  for example, by clicking on a button.  The action may result
-in page navigation.
-      </mfp:description>
-      <mfp:event-type>javax.faces.Action</mfp:event-type>
-      <mfp:event-class>javax.faces.event.ActionEvent</mfp:event-class>
-      <mfp:event-listener-class>javax.faces.event.ActionListener</mfp:event-listener-class>
-      <mfp:event-source-interface>javax.faces.component.ActionSource</mfp:event-source-interface>
-      <mfp:event-delivery-phases>Invoke Application,Apply Request Values</mfp:event-delivery-phases>
-    </mfp:event>
-  </faces-config-extension>
-</faces-config>
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/events/trinidad/faces/Launch.xml b/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/events/trinidad/faces/Launch.xml
deleted file mode 100644
index c8dc1c6..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/events/trinidad/faces/Launch.xml
+++ /dev/null
@@ -1,36 +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.
-	   
--->
-<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
-              xmlns:md="http://myfaces.apache.org/bali/xml/metadata"
-              xmlns:mfp="http://myfaces.apache.org/maven-faces-plugin" >
-  <faces-config-extension>
-      <mfp:event>
-        <mfp:description>
-          Event delivered to prompt the command to launch a dialog.
-        </mfp:description>
-        <mfp:event-type>org.apache.myfaces.trinidad.Launch</mfp:event-type>
-        <mfp:event-class>org.apache.myfaces.trinidad.event.LaunchEvent</mfp:event-class>
-        <mfp:event-listener-class>org.apache.myfaces.trinidad.event.LaunchListener</mfp:event-listener-class>
-        <mfp:event-source-interface>org.apache.myfaces.trinidad.component.DialogSource</mfp:event-source-interface>
-        <mfp:event-delivery-phases>Invoke Application,Apply Request Values</mfp:event-delivery-phases>
-      </mfp:event>
-  </faces-config-extension>
-</faces-config>
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/events/trinidad/faces/Return.xml b/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/events/trinidad/faces/Return.xml
deleted file mode 100644
index 0c0347c..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/events/trinidad/faces/Return.xml
+++ /dev/null
@@ -1,36 +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.
-	   
--->
-<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
-              xmlns:md="http://myfaces.apache.org/bali/xml/metadata"
-              xmlns:mfp="http://myfaces.apache.org/maven-faces-plugin" >
-  <faces-config-extension>
-      <mfp:event>
-        <mfp:description>
-          Event delivered when the dialog has completed successfully.
-        </mfp:description>
-        <mfp:event-type>org.apache.myfaces.trinidad.Return</mfp:event-type>
-        <mfp:event-class>org.apache.myfaces.trinidad.event.ReturnEvent</mfp:event-class>
-        <mfp:event-listener-class>org.apache.myfaces.trinidad.event.ReturnListener</mfp:event-listener-class>
-        <mfp:event-source-interface>org.apache.myfaces.trinidad.component.DialogSource</mfp:event-source-interface>
-        <mfp:event-delivery-phases>Apply Request Values</mfp:event-delivery-phases>
-      </mfp:event>
-  </faces-config-extension>
-</faces-config>
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/faces-config.xml b/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/faces-config.xml
deleted file mode 100644
index 92ee457..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/faces-config.xml
+++ /dev/null
@@ -1,26 +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.
-	   
--->
-<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xi="http://www.w3.org/2001/XInclude">
-  <xi:include href="components/trinidad/faces/Command.xml" xpointer="/faces-config/*"></xi:include>
-  <xi:include href="events/javax/faces/Action.xml" xpointer="/faces-config/*"></xi:include>
-  <xi:include href="events/trinidad/faces/Launch.xml" xpointer="/faces-config/*"></xi:include>
-  <xi:include href="events/trinidad/faces/Return.xml" xpointer="/faces-config/*"></xi:include>
-</faces-config>
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/testGenerate.lst b/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/testGenerate.lst
deleted file mode 100644
index 92ee457..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/testGenerate.lst
+++ /dev/null
@@ -1,26 +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.
-	   
--->
-<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xi="http://www.w3.org/2001/XInclude">
-  <xi:include href="components/trinidad/faces/Command.xml" xpointer="/faces-config/*"></xi:include>
-  <xi:include href="events/javax/faces/Action.xml" xpointer="/faces-config/*"></xi:include>
-  <xi:include href="events/trinidad/faces/Launch.xml" xpointer="/faces-config/*"></xi:include>
-  <xi:include href="events/trinidad/faces/Return.xml" xpointer="/faces-config/*"></xi:include>
-</faces-config>
diff --git a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/testSkipAPI.lst b/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/testSkipAPI.lst
deleted file mode 100644
index 01a51bd..0000000
--- a/maven2-plugins/myfaces-faces-plugin/src/test/resources/META-INF/maven-faces-plugin/testSkipAPI.lst
+++ /dev/null
@@ -1 +0,0 @@
-components/javax/faces/NamingContainer.xml
diff --git a/maven2-plugins/myfaces-i18n-plugin/LICENSE.txt b/maven2-plugins/myfaces-i18n-plugin/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/maven2-plugins/myfaces-i18n-plugin/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/maven2-plugins/myfaces-i18n-plugin/NOTICE.txt b/maven2-plugins/myfaces-i18n-plugin/NOTICE.txt
deleted file mode 100644
index fa3dbd6..0000000
--- a/maven2-plugins/myfaces-i18n-plugin/NOTICE.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-=========================================================================
-==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
-==  Version 2.0, in this case for the Apache MyFaces Maven Plugins     ==
-=========================================================================
-
-This product includes software developed by 
-The Apache Software Foundation (http://www.apache.org/).
-
-Portions of this software were originally based on the following:
-
- - software copyright (c) 2000-2006, Oracle Corp, <http://www.oracle.com/>.
-and are licensed to the Apache Software Foundation under the 
-"Software Grant and Corporate Contribution License Agreement"
-
-See the LICENSE.txt file for information on all licenses 
-associated with this software.
diff --git a/maven2-plugins/myfaces-i18n-plugin/pom.xml b/maven2-plugins/myfaces-i18n-plugin/pom.xml
deleted file mode 100644
index 0f8e0f9..0000000
--- a/maven2-plugins/myfaces-i18n-plugin/pom.xml
+++ /dev/null
@@ -1,81 +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.
--->
-
-<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>
-    <groupId>org.apache.myfaces.buildtools</groupId>
-    <artifactId>myfaces-plugin-parent</artifactId>
-    <version>1.0.2</version>
-  </parent>
-
-  <groupId>org.apache.myfaces.buildtools</groupId>
-  <artifactId>myfaces-i18n-plugin</artifactId>
-  <version>1.0.1-SNAPSHOT</version>
-  <packaging>maven-plugin</packaging>
-  <name>Apache MyFaces Buildtools Maven2 i18n Plugin</name>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <inherited>true</inherited>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-plugin-plugin</artifactId>
-        <version>2.2</version>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-      <version>2.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId>
-      <version>2.0</version>
-    </dependency>
-  </dependencies>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-plugin-plugin</artifactId>
-        <version>2.2</version>
-      </plugin>
-    </plugins>
-  </reporting>
-
-</project>
diff --git a/maven2-plugins/myfaces-i18n-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/i18n/GenerateJavascriptLocalesMojo.java b/maven2-plugins/myfaces-i18n-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/i18n/GenerateJavascriptLocalesMojo.java
deleted file mode 100644
index edd84ba..0000000
--- a/maven2-plugins/myfaces-i18n-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/i18n/GenerateJavascriptLocalesMojo.java
+++ /dev/null
@@ -1,156 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.i18n;
-
-import java.io.File;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-import org.apache.myfaces.buildtools.maven2.plugin.i18n.uixtools.JSLocaleElementsGenerator;
-
-import org.apache.maven.model.Resource;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-
-/**
- * @version $Id$
- * @goal generate-javascript-locales
- * @phase generate-sources
- */
-public class GenerateJavascriptLocalesMojo extends AbstractMojo
-{
-  /**
-   * Execute the Mojo.
-   */
-  public void execute() throws MojoExecutionException
-  {
-    try
-    {
-      // add generated sources to compilation classpath
-      addResourceRoot(targetDirectory.getCanonicalPath());
-
-      File outputDirectory = new File(targetDirectory, targetPath);
-
-      // Incremental check
-      boolean uptodate = false;
-
-      // TODO: determine how best to check for incremental
-//      if (!force)
-//      {
-//        String[] localeStrings = getLocaleStrings();
-//        String bundlePath = JSLocaleElementsGenerator._DEFAULT_BUNDLE_LOCATION_PATH;
-//        for (int i=0; i < localeStrings.length; i++)
-//        {
-//          String path = bundlePath + "LocaleElements" +
-//                        localeStrings[i] + ".java";
-//          File targetFile = new File(targetDirectory, path);
-//          if (!targetFile.exists())
-//          {
-//            uptodate = false;
-//            break;
-//          }
-//        }
-//      }
-
-      if (force || !uptodate)
-      {
-        getLog().info("Generating Javascript Locales");
-
-        List argsList = new ArrayList();
-
-        argsList.add("outDir=" + outputDirectory.getCanonicalPath());
-        argsList.add("writeJavascript=true");
-        argsList.add("writeSource=false");
-        argsList.add("verbose=false");
-        argsList.add("prettyPrint=true");
-
-        String[] args = (String[])argsList.toArray(new String[0]);
-        JSLocaleElementsGenerator.main(args);
-      }
-      else
-      {
-        getLog().info("Nothing to generate - Javascript Locales are up to date");
-      }
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw new MojoExecutionException(e.getMessage());
-    }
-  }
-
-  // TODO: use project.addResourceRoot()
-  protected void addResourceRoot(
-    String resourceRoot)
-  {
-    List resources = project.getBuild().getResources();
-    Resource resource = new Resource();
-    resource.setDirectory(resourceRoot);
-    resources.add(resource);
-  }
-
-  private String[] getLocaleStrings()
-  {
-    if ("en_US".equals(locale))
-    {
-      return new String[] { "" };
-    }
-
-    Locale[] locales = Locale.getAvailableLocales();
-    String[] localeStrings = new String[locales.length];
-
-    for (int i=0; i < localeStrings.length; i++)
-    {
-      localeStrings[i] = locales[i].getDisplayName();
-    }
-
-    return localeStrings;
-  }
-
-  /**
-   * @parameter expression="${project}"
-   * @required
-   * @readonly
-   */
-  private MavenProject project;
-
-  /**
-   * @parameter expression="${project.build.directory}/maven-i18n-plugin/main/javascript"
-   * @required
-   */
-  private File targetDirectory;
-
-  /**
-   * @parameter
-   */
-  private String targetPath = "";
-
-  /**
-   * @parameter
-   */
-  private String locale;
-
-  /**
-   * @parameter
-   */
-  private boolean force;
-}
diff --git a/maven2-plugins/myfaces-i18n-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/i18n/GenerateLocaleElementsMojo.java b/maven2-plugins/myfaces-i18n-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/i18n/GenerateLocaleElementsMojo.java
deleted file mode 100644
index bed58ba..0000000
--- a/maven2-plugins/myfaces-i18n-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/i18n/GenerateLocaleElementsMojo.java
+++ /dev/null
@@ -1,139 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.i18n;
-
-import java.io.File;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-import org.apache.myfaces.buildtools.maven2.plugin.i18n.uixtools.JSLocaleElementsGenerator;
-
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-
-/**
- * @version $Id$
- * @goal generate-locale-elements
- * @phase generate-sources
- */
-public class GenerateLocaleElementsMojo extends AbstractMojo
-{
-  /**
-   * Execute the Mojo.
-   */
-  public void execute() throws MojoExecutionException
-  {
-    try
-    {
-      // add generated sources to compilation classpath
-      project.addCompileSourceRoot(targetDirectory.getCanonicalPath());
-
-      // Incremental check
-      boolean uptodate = true;
-
-      if (!force)
-      {
-        String[] localeStrings = getLocaleStrings();
-        String bundlePath = JSLocaleElementsGenerator._DEFAULT_BUNDLE_LOCATION_PATH;
-        for (int i=0; i < localeStrings.length; i++)
-        {
-          String path = bundlePath + "LocaleElements" +
-                        localeStrings[i] + ".java";
-          File targetFile = new File(targetDirectory, path);
-          if (!targetFile.exists())
-          {
-            uptodate = false;
-            break;
-          }
-        }
-      }
-
-      if (force || !uptodate)
-      {
-        getLog().info("Generating LocaleElements");
-
-        List argsList = new ArrayList();
-
-        argsList.add("sourceDir=" + targetDirectory.getCanonicalPath());
-        argsList.add("bundleOutDir=" + targetDirectory.getCanonicalPath());
-        argsList.add("writeJavascript=false");
-        argsList.add("writeSource=true");
-        argsList.add("generateBundleBaseOnly=" + ("en_US".equals(locale)));
-        argsList.add("verbose=false");
-        argsList.add("prettyPrint=true");
-
-        String[] args = (String[])argsList.toArray(new String[0]);
-        JSLocaleElementsGenerator.main(args);
-      }
-      else
-      {
-        getLog().info("Nothing to generate - LocaleElements are up to date");
-      }
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      throw new MojoExecutionException(e.getMessage());
-    }
-  }
-
-  private String[] getLocaleStrings()
-  {
-    if ("en_US".equals(locale))
-    {
-      return new String[] { "" };
-    }
-
-    Locale[] locales = Locale.getAvailableLocales();
-    String[] localeStrings = new String[locales.length];
-
-    for (int i=0; i < localeStrings.length; i++)
-    {
-      localeStrings[i] = locales[i].getDisplayName();
-    }
-
-    return localeStrings;
-  }
-
-  /**
-   * @parameter expression="${project}"
-   * @required
-   * @readonly
-   */
-  private MavenProject project;
-
-  /**
-   * @parameter expression="${project.build.directory}/maven-i18n-plugin/main/java"
-   * @required
-   */
-  private File targetDirectory;
-
-  /**
-   * @parameter
-   */
-  private String locale;
-
-  /**
-   * @parameter
-   */
-  private boolean force;
-}
diff --git a/maven2-plugins/myfaces-i18n-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/i18n/uixtools/JSLocaleElementsGenerator.java b/maven2-plugins/myfaces-i18n-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/i18n/uixtools/JSLocaleElementsGenerator.java
deleted file mode 100644
index 3dd5def..0000000
--- a/maven2-plugins/myfaces-i18n-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/i18n/uixtools/JSLocaleElementsGenerator.java
+++ /dev/null
@@ -1,906 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.i18n.uixtools;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.Writer;
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.text.NumberFormat;
-import java.util.Enumeration;
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Generates JavaScript libraries containing the Locale information from
- * Java.
- * @version $Name:  $ ($Revision: 1.3 $) $Date: 2004/03/25 22:36:42 $
- */
-public class JSLocaleElementsGenerator
-{
-  public static void main(
-    String[] args
-    )
-  {
-
-    if ((args.length == 1) && ("?".equals(args[0])))
-    {
-      System.out.println("Generates JavaScript Locale information files");
-      System.out.println("for the Locales available in the JVM.");
-      System.out.println("These files are used by the Cabo HTML client");
-      System.out.println("logic to handle date formatting and validation.");
-      System.out.println();
-      System.out.println("Parameters:");
-      System.out.println("\tprettyPrint=false\tTurns off pretty printed output");
-      System.out.println("\toutDir=[path]\t\tDirectory path to write JavaScript files to");
-      System.out.println("\tsourceDir=[path]\t\tRoot directory path to write Java source to");
-      System.out.println(
-          "\tbundleOutDir=[path]\t\tRoot directory path to write " +
-          "Java ResourceBundles to (defaults to sourceDir).");
-      System.out.println(
-          "\tvariant=[variant name]\t\tIf supplied utility will generate " +
-          "ResourceBundles for this variant, and nothing else.");
-      System.out.println("\tverbose=true\t\tTurns on verbose output");
-      System.out.println("\tgenerateBundleBaseOnly=true\t\tGenerates the base LocaleElement.java file only");
-      System.exit(0);
-    }
-
-    // whether the output should be pretty printed for legibility
-    boolean prettyPrint = getArgBooleanValue(args, "prettyPrint", true);
-
-    // whether verbose ouput should be generated.
-    boolean verbose = getArgBooleanValue(args, "verbose", false);
-
-    boolean writeSource = getArgBooleanValue(args, "writeSource", true);
-    boolean writeJavascript = getArgBooleanValue(args, "writeJavascript", true);
-
-    // whether only the Base LocaleElements.java file should be created.
-    // this is based on the Locale.US
-    boolean generateBundleBaseOnly = getArgBooleanValue(args,"generateBundleBaseOnly",false);
-
-    // the output directory
-    String outDir = getArgStringValue(args, "outDir", null);
-
-    if (outDir == null)
-    {
-      outDir = System.getProperty("user.dir") +
-               File.separator +
-               _DEFAULT_LOCATION_PATH;
-    }
-
-    if (!outDir.endsWith(File.separator))
-    {
-      outDir = outDir + File.separator;
-    }
-
-
-    // the requested variant
-    String variant = getArgStringValue(args, "variant", null);
-    boolean writeAll = true;
-    if (variant != null)
-    {
-      writeAll = false;
-      variant = variant.toUpperCase();
-    }
-
-    // the source directory
-    String sourceDir = getArgStringValue(args, "sourceDir", null);
-
-    if (sourceDir == null)
-    {
-      sourceDir = System.getProperty("user.dir");
-    }
-
-    String bundleOutDir = getArgStringValue(args, "bundleOutDir", null);
-
-    if (bundleOutDir == null)
-    {
-      bundleOutDir = sourceDir;
-    }
-
-    // The bundle output dir is the base of the heirarchy, we'll actually put
-    // the files into the appropriate sub directory for the package.
-    String fullBundleOutDir = (bundleOutDir
-                               + (bundleOutDir.endsWith(File.separator)
-                                  ? ""
-                                  : File.separator)
-                              + _DEFAULT_BUNDLE_LOCATION_PATH);
-
-    String version = getArgStringValue(args, "version", null);
-    version = VersionUtils.normalizeVersionSuffix(version);
-
-    if (verbose)
-    {
-      System.out.println("Writing files to: " + outDir);
-      if (writeAll)
-      {
-        System.out.println("Writing source to: " + sourceDir);
-      }
-      System.out.println("Writing bundles to: " + fullBundleOutDir);
-    }
-
-    try
-    {
-      File localeListFile = null;
-
-      if (writeSource)
-      {
-        (new File(fullBundleOutDir)).mkdirs();
-      }
-
-      if (writeJavascript)
-      {
-        (new File(outDir)).mkdirs();
-      }
-
-      if (writeAll && writeSource && !generateBundleBaseOnly)
-      {
-        localeListFile = new File(sourceDir, _LOCALE_LIST_PATH);
-        localeListFile.getParentFile().mkdirs();
-        localeListFile.createNewFile();
-      }
-
-      Locale[] locales = null;
-
-      if (generateBundleBaseOnly)
-      {
-         locales = new Locale[1];
-         locales[0] = Locale.US;
-      }
-      else
-      {
-        locales = Locale.getAvailableLocales();
-      }
-
-      //
-      // loop through the available Locales, writing their contents out
-      // as JavaScript libraries and/or ResourceBundles
-      //
-      for (int i = 0; i < locales.length; i++)
-      {
-        // write the JavaSCript library for this locale
-        _generateJSLocaleElements(outDir, fullBundleOutDir, locales[i],
-                                  variant, prettyPrint, verbose,
-                                  writeJavascript, writeSource, generateBundleBaseOnly, version);
-      }
-
-      // And write out a listing of all the locales, but  not when we want to
-      // just generate the base Resource file.
-      if (writeAll && writeSource && !generateBundleBaseOnly)
-      {
-        Writer sourceWriter = new FileWriter(localeListFile);
-        sourceWriter.write(_LOCALE_LIST_CODE_START);
-
-        for (int i = 0; i < locales.length; i++)
-        {
-          sourceWriter.write("    new Locale(\"");
-          sourceWriter.write(locales[i].getLanguage());
-          sourceWriter.write("\",\"");
-          sourceWriter.write(locales[i].getCountry());
-          sourceWriter.write("\",\"");
-          sourceWriter.write(locales[i].getVariant());
-          sourceWriter.write("\"),\n");
-        }
-        sourceWriter.write(_LOCALE_LIST_CODE_END);
-        sourceWriter.close();
-      }
-    }
-    catch (IOException e)
-    {
-      System.err.println(e);
-      e.printStackTrace();
-    }
-
-    if (verbose)
-    {
-      System.out.println("Done writing files");
-    }
-  }
-
-  private static String getArgStringValue(
-    String[] args,
-    String   argName,
-    String   defaultValue
-    )
-  {
-    int argLength = argName.length();
-
-    for (int i = 0; i < args.length; i++)
-    {
-      String currArg = args[i];
-
-      if (currArg.startsWith(argName))
-      {
-        if (!currArg.equals(argName) &&
-            ('=' == currArg.charAt(argLength)))
-        {
-          return currArg.substring(argLength + 1);
-        }
-      }
-    }
-
-    return defaultValue;
-  }
-
-  private static boolean getArgBooleanValue(
-    String[] args,
-    String   argName,
-    boolean  defaultValue
-    )
-  {
-    //
-    // check for = true or = false
-    //
-    String argValue = getArgStringValue(args, argName, null);
-
-    if (argValue != null)
-    {
-      // check for = self
-      if (argName.equals(argValue))
-      {
-        return true;
-      }
-      else
-      {
-        return Boolean.valueOf(argValue).booleanValue();
-      }
-    }
-
-    //
-    // check for the name by itself
-    //
-    for (int i = 0; i < args.length; i++)
-    {
-      if (args[i].equals(argName))
-      {
-        return true;
-      }
-    }
-
-    //
-    // check for the name turned off
-    //
-    String notName = "-" + argName;
-
-    for (int i = 0; i < args.length; i++)
-    {
-      if (args[i].equals(notName))
-      {
-        return false;
-      }
-    }
-
-    return defaultValue;
-  }
-
-  private static void _generateJSLocaleElements(
-    String  outDir,
-    String  bundleOutDir,
-    Locale  targetLocale,
-    String  variant,
-    boolean prettyPrint,
-    boolean verbose,
-    boolean writeJavascript,
-    boolean writeSource,
-    boolean generateBundleBaseOnly,
-    String version
-    ) throws IOException
-  {
-    String fileName;
-    PrintWriter localeWriter;
-
-    if (variant == null && writeJavascript)
-    {
-      fileName = _getFileName(targetLocale, version, generateBundleBaseOnly) + _JAVASCRIPT_EXTENSION;
-
-      if (verbose)
-      {
-        System.out.println("Writing " + fileName);
-      }
-
-      // create the file to write to
-      localeWriter = new PrintWriter
-        (new BufferedWriter(new FileWriter(outDir + fileName),
-                            _DEFAULT_BUFFER_SIZE));
-      _writeLocale(localeWriter, targetLocale, prettyPrint);
-      localeWriter.close();
-    }
-  }
-
-  private static void _writeJavaBundle(
-    Writer      output,
-    Locale      targetLocale,
-    String      fileName
-    ) throws IOException
-  {
-    output.write(_LOCALE_JAVA_CODE_START);
-    output.write("public class "
-                 + fileName
-                 + " extends ListResourceBundle\n{\n"
-                 + "  public Object[][] getContents()\n  {\n"
-                 + "    return contents;\n  }\n\n");
-    try
-    {
-      ResourceBundle elementsData =
-        ResourceBundle.getBundle(_LOCALE_ELEMENTS_PATH, targetLocale);
-
-      boolean doneOne = false;
-
-      for (int i = 0; i < LOCALE_ELEMENTS_GET_KEYS.length; i ++)
-      {
-        String currKey = LOCALE_ELEMENTS_GET_KEYS[i];
-
-        Object data = _getElementData(currKey, elementsData, targetLocale);
-        _writeJavaBundleElement(output, currKey, data, doneOne);
-        doneOne = true;
-      }
-      doneOne = false;
-      output.write("  static final Object[][] contents = \n  {\n");
-      for (int i = 0; i < LOCALE_ELEMENTS_GET_KEYS.length; i ++)
-      {
-        String currKey = LOCALE_ELEMENTS_GET_KEYS[i];
-        output.write((doneOne ? ",\n" : "")
-                     + "    { \""
-                     + currKey
-                     + "\", "
-                     + _getKeyArrayName(currKey)
-                     + "}");
-        doneOne = true;
-      }
-      output.write("\n  };");
-    }
-    catch (MissingResourceException e)
-    {
-      // make sure that the class will, at least, compile even if incomplete.
-      output.write("  // Bundle generation error:\n  // " + e);
-      output.write("\n  static final Object[][] contents = null;");
-      System.err.println(e);
-    }
-    output.write("\n}\n");
-  }
-
-  private static void _writeLocale(
-    Writer      output,
-    Locale      targetLocale,
-    boolean     prettyPrint
-    ) throws IOException
-  {
-
-    output.write("var LocaleSymbols_");
-    output.write(targetLocale.toString());
-    output.write(" = new LocaleSymbols({");
-
-    if (prettyPrint)
-    {
-      output.write('\n');
-    }
-
-    Enumeration zoneEnumeration =
-                               new ArrayEnumeration(DATE_FORMAT_ZONE_GET_KEYS);
-
-    // write the locale elements into the file
-    _writeResourceContents(output,
-                           _LOCALE_ELEMENTS_PATH,
-                           new ArrayEnumeration(LOCALE_ELEMENTS_GET_KEYS),
-                           targetLocale,
-                           zoneEnumeration.hasMoreElements(),
-                           prettyPrint);
-
-    // write the date format elements into the file
-    _writeResourceContents(output,
-                           _DATE_FORMAT_ZONE_PATH,
-                           zoneEnumeration,
-                           targetLocale,
-                           false,  // this is the last resource to write
-                           prettyPrint);
-
-    output.write("});");
-
-    if (prettyPrint)
-    {
-      output.write('\n');
-    }
-  }
-
-
-  private static void _writeResourceContents(
-    Writer      output,
-    String      baseName,
-    Enumeration keys,
-    Locale      targetLocale,
-    boolean     hasMoreResources,
-    boolean     prettyPrint
-    ) throws IOException
-  {
-    try
-    {
-      ResourceBundle elementsData = ResourceBundle.getBundle(baseName,
-                                                             targetLocale);
-
-      while(keys.hasMoreElements())
-      {
-        String currKey = (String)keys.nextElement();
-
-        Object data = null;
-
-        if("CurrencyElements".equals(currKey))
-        {
-          data = _getCurrencyData(targetLocale);
-        }
-        else
-        {
-          data = _getElementData(currKey, elementsData, targetLocale);
-        }
-
-        boolean wroteElement = _writeResourceElement(
-                                    output,
-                                    currKey,
-                                    data,
-                                    hasMoreResources || keys.hasMoreElements(),
-                                    prettyPrint);
-
-        if (wroteElement && prettyPrint)
-        {
-          output.write('\n');
-        }
-      }
-    }
-    catch (MissingResourceException e)
-    {
-      System.err.println(e);
-    }
-  }
-
-  private static Object _getCurrencyData(
-    Locale targetLocale)
-  {
-    DecimalFormat df = (DecimalFormat) NumberFormat.getCurrencyInstance(targetLocale);
-    DecimalFormatSymbols decimalFormatSymbols = df.getDecimalFormatSymbols();
-    Object[] currencyData = new Object[6];
-    currencyData[0] = decimalFormatSymbols.getCurrencySymbol(); 
-    currencyData[1] = decimalFormatSymbols.getCurrency().getCurrencyCode();
-    currencyData[2] = df.getPositivePrefix();
-    currencyData[3] = df.getPositiveSuffix();
-    currencyData[4] = df.getNegativePrefix();
-    currencyData[5] = df.getNegativeSuffix();
-
-    return currencyData;
-  }
-
-  private static Object _getElementData(
-    String currKey,
-    ResourceBundle elementsData,
-    Locale targetLocale
-   )
-  {
-    return elementsData.getObject(currKey);
-  }
-
-  private static boolean _writeResourceElement(
-    Writer  output,
-    String  key,
-    Object  value,
-    boolean notLast,
-    boolean prettyPrint
-    ) throws IOException
-  {
-    if (key != null)
-    {
-      // start writing element, using key as the property name
-      output.write(key);
-      output.write(':');
-    }
-
-    Object[] values = null;
-    int valueCount = 0;
-
-    if (value instanceof Object[])
-    {
-      values = (Object[])value;
-
-      valueCount = values.length;
-
-      if (valueCount == 0)
-      {
-        value = "";
-      }
-    }
-
-    if (valueCount != 0)
-    {
-      // output.write("new Array(");
-      output.write('[');
-
-      for (int i = 0; i < valueCount; i++)
-      {
-        _writeResourceElement(output,
-                              null,
-                              values[i],
-                              i < valueCount - 1,
-                              prettyPrint);
-      }
-
-      //output.write(')');
-      output.write(']');
-    }
-    else
-    {
-      output.write('\"');
-      _writeEscapedString(output, value.toString(), false);
-      output.write('\"');
-    }
-
-    if (notLast)
-    {
-      output.write(',');
-
-      if (prettyPrint)
-      {
-        output.write(' ');
-      }
-    }
-
-    // we wrote some ouput
-    return true;
-  }
-
-  private static void _writeJavaBundleElement(
-    Writer  output,
-    String  key,
-    Object  value,
-    boolean wasPrevious
-    ) throws IOException
-  {
-    output.write("  private static final String "
-                 + _getKeyArrayName(key)
-                 + "[]");
-    Object[] values = null;
-    int valueCount = 0;
-    boolean doneOne = false;
-
-    if (value instanceof Object[])
-    {
-      values = (Object[]) value;
-
-      valueCount = values.length;
-
-      if (valueCount <= 0)
-      {
-        values = _EMPTY_VALUES;
-        valueCount = 1;
-      }
-    }
-
-    if (valueCount > 0)
-    {
-      output.write(" = \n  {\n");
-      for (int i = 0; i < valueCount; i++)
-      {
-        output.write((doneOne ? ", \n" : "") + "    \"");
-        _writeEscapedString(output, values[i].toString(), true);
-        output.write("\"");
-        doneOne = true;
-      }
-      output.write("\n  };\n\n");
-    }
-    else
-    {
-      output.write(" = null");
-    }
-  }
-
-  private static void _writeEscapedString(
-    Writer output,
-    String value,
-    boolean isJava
-    ) throws IOException
-  {
-    int length = value.length();
-
-    for (int i = 0; i < length; i++)
-    {
-      char currChar = value.charAt(i);
-
-      if (currChar > 255)
-      {
-        output.write("\\u");
-        output.write(_getHexString(currChar, 4));
-      }
-      else
-      {
-        if (isJava)
-        {
-          if ((currChar > 31)
-              && (currChar < 128))
-          {
-            if (currChar == '\"')
-            {
-              output.write("\\\"");
-            }
-            else
-            {
-              output.write(currChar);
-            }
-          }
-          else
-          {
-            output.write("\\u");
-            output.write(_getHexString(currChar, 4));
-          }
-        }
-        else
-        {
-          // write ascii printable characters, except for the double quote,
-          // which needs to be escaped because we are already in a String.
-          if ((currChar > 31)    &&
-              (currChar < 128)   &&
-              (currChar != '\"') &&
-              (currChar != '\''))
-          {
-            output.write(currChar);
-          }
-          else
-          {
-            output.write("\\x");
-            output.write(_getHexString(currChar, 2));
-          }
-        }
-      }
-    }
-  }
-
-
-  private static String _getHexString(
-    int number,
-    int minDigits
-    )
-  {
-    String hexString = Integer.toHexString(number);
-
-    int hexLength = hexString.length();
-
-    int zeroPadding = minDigits - hexLength;
-
-    if (zeroPadding > 0)
-    {
-      String paddedString = "0";
-
-      while (zeroPadding > 1)
-      {
-        paddedString += "0";
-        zeroPadding--;
-      }
-
-      hexString = paddedString + hexString;
-    }
-    else
-    {
-      if (zeroPadding < 0)
-      {
-        throw new IllegalArgumentException();
-      }
-    }
-
-    return hexString;
-  }
-
-  private static String _getKeyArrayName(String key)
-  {
-    return "_array" + key;
-  }
-
-  private static String _getFileName(
-    Locale locale,
-    String version,
-    boolean generateBundleBaseOnly
-    )
-  {
-
-    if (generateBundleBaseOnly)
-    {
-      return "LocaleElements";
-    }
-
-    if (version == null)
-    {
-      return "LocaleElements_" + locale;
-    }
-    return "LocaleElements_" + locale + version;
-  }
-
-  private static String _getLocaleSuffix(
-    Locale locale
-    )
-  {
-    String localeString =  locale.toString();
-
-    return localeString.substring(localeString.indexOf('_'));
-  }
-
-  //
-  // Array of DateFormatZoneData key names to retrieve.
-  // Only keys from this list are used to generate locale information
-  //
-  private static final String[] LOCALE_ELEMENTS_GET_KEYS = 
-  {
-    "MonthNames",
-    "MonthAbbreviations",
-    "DayNames",
-    "DayAbbreviations",
-    "AmPmMarkers",
-    "Eras",
-    "DateTimePatterns",
-    "DateTimeElements",
-    "NumberElements",
-    "CurrencyElements",
-  };
-
-  //
-  // Array of DateFormatZoneData key names to retrieve.
-  // Only keys from this list are used to generate locale information
-  //
-  private static final String[] LOCALE_ELEMENTS_MAPPINGS = 
-  {
-    "MonthNames", "getMonths",
-    "MonthAbbreviations", "getShortMonths",
-    "DayNames", "getWeekdays",
-    "DayAbbreviations", "getShortWeekdays",
-    "AmPmMarkers", "getAmPmStrings",
-    "Eras", "getEras",
-    "DateTimePatterns", null,
-    "DateTimeElements", null,
-    "NumberElements", null
-  };
-
-  //
-  // Array of LocaleElements key names to retrieve.
-  // Only keys from this list are used to generate locale information
-  //
-  private static final String[] DATE_FORMAT_ZONE_GET_KEYS = {};
-
-  // J2SE 1.3:
-  // private static String _RESOURCES_PACKAGE = "java.text.resources";
-
-  // J2SE 1.4:
-  private static final String _RESOURCES_PACKAGE = "sun.text.resources";
-
-  private static final String _DATE_FORMAT_ZONE_PATH =
-                          _RESOURCES_PACKAGE + ".DateFormatZoneData";
-
-  private static final String _LOCALE_ELEMENTS_PATH =
-                          _RESOURCES_PACKAGE + ".LocaleElements";
-
-  private static final String _DEFAULT_LOCATION_PATH =
-          "org\\apache\\myfaces\\trinidadinternal\\ui\\jsLibs\\resources\\".replace('\\',
-                                                          File.separatorChar);
-
-  // Mimicking to be in api path. In the trinidad-faces impl side we have
-  // the following directory structure. There is identical directory sturcture
-  // in trinidad-faces api side.
-  // Only _TRINIDAD_LOCALE_ELEMENT base file will be added to the api side,
-  // while all the variants will be in impl side in the directory structure
-  // defined below.
-  private static final String _TRINIDAD_LOCALE_ELEMENTS_PACKAGE =
-    "org.apache.myfaces.trinidad.resource";
-
-  public static final String _DEFAULT_BUNDLE_LOCATION_PATH =
-    (_TRINIDAD_LOCALE_ELEMENTS_PACKAGE.replace('.', File.separatorChar)
-     + File.separatorChar);
-
-  private static final String _TRINIDAD_LOCALE_ELEMENTS_PATH =
-    _TRINIDAD_LOCALE_ELEMENTS_PACKAGE + ".LocaleElements";
-
-  // buffer size of the BufferedWriter to which output is written
-  private static final int _DEFAULT_BUFFER_SIZE = 1 << 14;
-
-  private static final String _LOCALE_LIST_PATH =
-          "org\\apache\\myfaces\\trinidadinternal\\ui\\laf\\base\\xhtml\\LocaleList.java".replace('\\',
-                                                          File.separatorChar);
-
-  private static final String _EMPTY_VALUES[] = { "" };
-
-  private static final String _LOCALE_LIST_CODE_START =
-"/*\n" +
-"**\n" +
-"**34567890123456789012345678901234567890123456789012345678901234567890123456789\n" +
-"*/\n" +
-"package org.apache.myfaces.trinidadinternal.ui.laf.base.xhtml;\n" +
-"\n" +
-"import java.util.Locale;\n" +
-"\n" +
-"import java.util.HashMap;\n" +
-"\n" +
-"/*\n" +
-" * List of supported locales.  Automatically generated - do not modify!\n" +
-" */\n" +
-"public class LocaleList\n" +
-"{\n" +
-"  /*\n" +
-"   * Returns the list of supported locales.\n" +
-"   */\n" +
-"  static public HashMap<Locale, Locale> getSupportedLocales()\n" +
-"  {\n" +
-"    return _sLocaleMapper;\n" +
-"  }\n" +
-"  \n" +
-"  private LocaleList()\n" +
-"  {\n" +
-"  }\n" +
-"\n" +
-"  static private final Locale[] _sLocales = new Locale[]\n" +
-"  {\n";
-
-
-  private static final String _LOCALE_LIST_CODE_END =
-"  };\n" +
-"\n" +
-"  static private HashMap<Locale, Locale> _sLocaleMapper;\n" +
-"\n" +
-"  static\n" +
-"  {\n" +
-"    _sLocaleMapper = new HashMap<Locale, Locale>();\n" +
-"    for(Locale locale : _sLocales)\n" +
-"    {\n" +
-"      _sLocaleMapper.put(locale, locale);\n" +
-"    }\n" +
-"  }\n" +
-"}\n";
-
-  private static final String _LOCALE_JAVA_CODE_START =
-    "// Do not edit this file!\n"
-    + "// This file has been automatically generated.\n"
-    + "// Edit JSLocaleElementsGenerator instead.\n//\n"
-    + "package "
-    + _TRINIDAD_LOCALE_ELEMENTS_PACKAGE
-    + ";\n\n"
-    + "import java.util.ListResourceBundle;\n";
-
-  private static final String _JAVASCRIPT_EXTENSION = ".js";
-  private static final String _JAVA_EXTENSION = ".java";
- 
-  //Introduced to remove the dependency on bali-share in the api side.
-  private static class ArrayEnumeration implements Enumeration
-  {
-    public ArrayEnumeration(Object[] array)
-    {
-      _objects = (array == null)? _EMPTY_ARRAY : array;
-    }
-
-    public boolean hasMoreElements()
-    {
-      return _currentIndex < _objects.length;
-    }
-
-    public Object nextElement()
-    {
-      return _objects[_currentIndex++];
-    }
-
-    private Object[] _objects;
-
-    private int _currentIndex;
-
-    private static final Object[] _EMPTY_ARRAY = new Object[0];
-  }
-}
diff --git a/maven2-plugins/myfaces-i18n-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/i18n/uixtools/VersionUtils.java b/maven2-plugins/myfaces-i18n-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/i18n/uixtools/VersionUtils.java
deleted file mode 100644
index 069801b..0000000
--- a/maven2-plugins/myfaces-i18n-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/i18n/uixtools/VersionUtils.java
+++ /dev/null
@@ -1,35 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.i18n.uixtools;
-
-public class VersionUtils
-{
-  /**
-   * Normalize a version number for use as a file suffix.
-   */
-  static public String normalizeVersionSuffix(String version)
-  {
-    if (version == null)
-    {
-      return null;
-    }
-
-    return version.replace('.', '_');
-  }
-}
diff --git a/maven2-plugins/myfaces-javacc-plugin/LICENSE.txt b/maven2-plugins/myfaces-javacc-plugin/LICENSE.txt
deleted file mode 100644
index a775ea8..0000000
--- a/maven2-plugins/myfaces-javacc-plugin/LICENSE.txt
+++ /dev/null
@@ -1,242 +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.
-
-
-
-
-======================================
-  LICENSES FOR INCLUDED DEPENDENCIES
-======================================
-
-All the source code for the Trinidad Plugins project is released under the
-license above. Additionally, the Trinidad Plugins binary distribution
-includes a number of third-party files that are required in
-order to the software to function. Unless noted below, these jars
-and resource files are also released under the ASF license above.
-
-The exceptions are as follows:
-
-===========================
-  javacc included in the maven-javacc-plugin, taken from:
-  http://javacc.dev.java.net
-===========================
-
-
-Copyright (c) 2003 Sun Microsystems, Inc. All  Rights Reserved.
-
-Redistribution and use in source and binary forms, with or without modification, 
-are permitted provided that the following conditions are met:
-
--Redistribution of source code must retain the above copyright notice, this  list of conditions and the following disclaimer.
-
--Redistribution 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.
-
-Neither the name of Sun Microsystems, Inc. or the names of contributors may 
-be used to endorse or promote products derived from this software without 
-specific prior written permission.
-
-This software is provided "AS IS," without a warranty of any kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-You acknowledge that  this software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility.
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javacc-plugin/NOTICE.txt b/maven2-plugins/myfaces-javacc-plugin/NOTICE.txt
deleted file mode 100644
index fdc126b..0000000
--- a/maven2-plugins/myfaces-javacc-plugin/NOTICE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-=========================================================================
-==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
-==  Version 2.0, in this case for the Apache MyFaces Maven Plugins     ==
-=========================================================================
-
-This product includes software developed by 
-The Apache Software Foundation (http://www.apache.org/).
-
-Portions of this software were originally based on the following:
-
-- software copyright (c) 2000-2006, Oracle Corp, <http://www.oracle.com/>.
-and are licensed to the Apache Software Foundation under the 
-"Software Grant and Corporate Contribution License Agreement"
-
-Trinidad Plugins is bundled with the binaries from the javacc project, by
-Sun Microsystems and licensed under the BSD. The source code is
-available at: https://javacc.dev.java.net/source/browse/javacc/
-
-See the LICENSE.txt file for information on all licenses 
-associated with this software.
diff --git a/maven2-plugins/myfaces-javacc-plugin/pom.xml b/maven2-plugins/myfaces-javacc-plugin/pom.xml
deleted file mode 100644
index cb9a15d..0000000
--- a/maven2-plugins/myfaces-javacc-plugin/pom.xml
+++ /dev/null
@@ -1,77 +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.
-	   
--->
-<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>
-    <groupId>org.apache.myfaces.buildtools</groupId>
-    <artifactId>myfaces-plugin-parent</artifactId>
-    <version>1.0.2</version>
-  </parent>
-
-  <groupId>org.apache.myfaces.buildtools</groupId>
-  <artifactId>myfaces-javacc-plugin</artifactId>
-  <version>1.0.1-SNAPSHOT</version>
-  <packaging>maven-plugin</packaging>
-  <name>Apache MyFaces Buildtools Maven2 Javacc Plugin</name>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-      <version>2.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId>
-      <version>2.0</version>
-    </dependency>
-    <dependency>
-      <groupId>plexus</groupId>
-      <artifactId>plexus-compiler-api</artifactId>
-      <version>1.4</version>
-    </dependency>
-    <dependency>
-      <groupId>plexus</groupId>
-      <artifactId>plexus-utils</artifactId>
-      <version>1.0.1</version>
-    </dependency>
-    <dependency>
-      <groupId>net.java.dev.javacc</groupId>
-      <artifactId>javacc</artifactId>
-      <version>3.2</version>
-    </dependency>
-  </dependencies>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-plugin-plugin</artifactId>
-        <version>2.2</version>
-      </plugin>
-    </plugins>
-  </reporting>
-
-
-</project>
diff --git a/maven2-plugins/myfaces-javacc-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javacc/JavaCCMojo.java b/maven2-plugins/myfaces-javacc-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javacc/JavaCCMojo.java
deleted file mode 100644
index 603aeb2..0000000
--- a/maven2-plugins/myfaces-javacc-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javacc/JavaCCMojo.java
+++ /dev/null
@@ -1,348 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javacc;
-
-import java.io.File;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-
-import org.codehaus.plexus.compiler.util.scan.InclusionScanException;
-import org.codehaus.plexus.compiler.util.scan.SourceInclusionScanner;
-import org.codehaus.plexus.compiler.util.scan.StaleSourceScanner;
-import org.codehaus.plexus.compiler.util.scan.mapping.SuffixMapping;
-import org.codehaus.plexus.util.FileUtils;
-
-
-/**
- * @goal generate
- * @phase generate-sources
- * @description Goal which parse a JJ file and transform it to Java Source Files.
- * @version $Id$
- */
-public class JavaCCMojo
-  extends AbstractMojo
-{
-  /**
-   * @parameter expression=1
-   * @required
-   */
-  private int lookAhead;
-
-  /**
-   * @parameter expression=2
-   * @required
-   */
-  private int choiceAmbiguityCheck;
-
-  /**
-   * @parameter expression=1
-   * @required
-   */
-  private int otherAmbiguityCheck;
-
-  /**
-   * @parameter expression="true"
-   * @required
-   */
-  private boolean isStatic;
-
-  /**
-   * @parameter expression="false"
-   * @required
-   */
-  private boolean debugParser;
-
-  /**
-   * @parameter expression="false"
-   * @required
-   */
-  private boolean debugLookAhead;
-
-  /**
-   * @parameter expression="false"
-   * @required
-   */
-  private boolean debugTokenManager;
-
-  /**
-   * @parameter expression="true"
-   * @required
-   */
-  private boolean optimizeTokenManager;
-
-  /**
-   * @parameter expression="true"
-   * @required
-   */
-  private boolean errorReporting;
-
-  /**
-   * @parameter expression="false"
-   * @required
-   */
-  private boolean javaUnicodeEscape;
-
-  /**
-   * @parameter expression="false"
-   * @required
-   */
-  private boolean unicodeInput;
-
-  /**
-   * @parameter expression="false"
-   * @required
-   */
-  private boolean ignoreCase;
-
-  /**
-   * @parameter expression="false"
-   * @required
-   */
-  private boolean commonTokenAction;
-
-  /**
-   * @parameter expression="false"
-   * @required
-   */
-  private boolean userTokenManager;
-
-  /**
-   * @parameter expression="false"
-   * @required
-   */
-  private boolean userCharStream;
-
-  /**
-   * @parameter expression="true"
-   * @required
-   */
-  private boolean buildParser;
-
-  /**
-   * @parameter expression="true"
-   * @required
-   */
-  private boolean buildTokenManager;
-
-  /**
-   * @parameter expression="true"
-   * @required
-   */
-  private boolean sanityCheck;
-
-  /**
-   * @parameter expression="false"
-   * @required
-   */
-  private boolean forceLaCheck;
-
-  /**
-   * @parameter expression="false"
-   * @required
-   */
-  private boolean cacheTokens;
-
-  /**
-   * @parameter expression="true"
-   * @required
-   */
-  private boolean keepLineColumn;
-
-  /**
-   * Directory where the JJ file(s) are located.
-   * @parameter expression="src/main/javacc"
-   */
-  private File sourceDirectory;
-
-  /**
-   * Path under source directory where the JJ file(s) are located.
-   * @parameter expression=""
-   */
-  private String sourcePath;
-
-  /**
-   * Directory where the output Java Files will be located.
-   * @parameter expression="${project.build.directory}/maven-javacc-plugin/src/main/java"
-   */
-  private File outputDirectory;
-
-  /**
-   * Path under output directory where the output Java Files will be located.
-   * @parameter expression=""
-   */
-  private String outputPath;
-
-  /**
-   * the directory to store the processed .jj files
-   *
-   * @parameter expression="${project.build.directory}/maven-javacc-plugin/src/main/conf"
-   */
-  private File timestampDirectory;
-
-  /**
-   * The granularity in milliseconds of the last modification
-   * date for testing whether a source needs recompilation
-   *
-   * @parameter expression="${lastModGranularityMs}" default-value="0"
-   */
-  private int staleMillis;
-
-  /**
-   * @parameter expression="${project}"
-   * @required
-   */
-  private MavenProject project;
-
-  /**
-   * @parameter expression=false
-   * @required
-   */
-  private boolean doNotGenerateTokenFile;
-
-  public void execute()
-    throws MojoExecutionException
-  {
-    File outDir = new File(outputDirectory, outputPath);
-
-    if (!outDir.exists())
-    {
-      outDir.mkdirs();
-    }
-
-    if (!timestampDirectory.exists())
-    {
-      timestampDirectory.mkdirs();
-    }
-
-    Set staleGrammars = computeStaleGrammars();
-
-    if (staleGrammars.isEmpty())
-    {
-      getLog().info("Nothing to process - all grammars are up to date");
-      if (project != null)
-      {
-        project.addCompileSourceRoot(outDir.getPath());
-      }
-      return;
-    }
-
-    for (Iterator i = staleGrammars.iterator(); i.hasNext(); )
-    {
-      File javaccFile = (File) i.next();
-      try
-      {
-        org.javacc.parser.Main.mainProgram(generateJavaCCArgumentList(javaccFile.getAbsolutePath()));
-
-        FileUtils.copyFileToDirectory(javaccFile, timestampDirectory);
-        if (doNotGenerateTokenFile == true)
-        {
-          File tokenFile  = new File(outDir, "Token.java");
-          FileUtils.forceDelete(tokenFile);
-        }
-      }
-      catch (Exception e)
-      {
-        throw new MojoExecutionException("JavaCC execution failed", e);
-      }
-    }
-
-    if (project != null)
-    {
-      project.addCompileSourceRoot(outputDirectory.getPath());
-    }
-  }
-
-
-  private String[] generateJavaCCArgumentList(String javaccInput)
-  {
-
-    File outDir = new File(outputDirectory, outputPath);
-
-    ArrayList argsList = new ArrayList();
-
-    argsList.add("-LOOKAHEAD=" + lookAhead);
-    argsList.add("-CHOICE_AMBIGUITY_CHECK=" + choiceAmbiguityCheck);
-    argsList.add("-OTHER_AMBIGUITY_CHECK=" + otherAmbiguityCheck);
-    argsList.add("-STATIC=" + isStatic);
-    argsList.add("-DEBUG_PARSER=" + debugParser);
-    argsList.add("-DEBUG_LOOKAHEAD=" + debugLookAhead);
-    argsList.add("-DEBUG_TOKEN_MANAGER=" + debugTokenManager);
-    argsList.add("-OPTIMIZE_TOKEN_MANAGER=" + optimizeTokenManager);
-    argsList.add("-ERROR_REPORTING=" + errorReporting);
-    argsList.add("-JAVA_UNICODE_ESCAPE=" + javaUnicodeEscape);
-    argsList.add("-UNICODE_INPUT=" + unicodeInput);
-    argsList.add("-IGNORE_CASE=" + ignoreCase);
-    argsList.add("-COMMON_TOKEN_ACTION=" + commonTokenAction);
-    argsList.add("-USER_TOKEN_MANAGER=" + userTokenManager);
-    argsList.add("-USER_CHAR_STREAM=" + userCharStream);
-    argsList.add("-BUILD_PARSER=" + buildParser);
-    argsList.add("-BUILD_TOKEN_MANAGER=" + buildTokenManager);
-    argsList.add("-SANITY_CHECK=" + sanityCheck);
-    argsList.add("-FORCE_LA_CHECK=" + forceLaCheck);
-    argsList.add("-CACHE_TOKENS=" + cacheTokens);
-    argsList.add("-KEEP_LINE_COLUMN=" + keepLineColumn);
-    argsList.add("-OUTPUT_DIRECTORY:" + outDir.getPath());
-    argsList.add(javaccInput);
-
-    getLog().debug("argslist: " + argsList.toString());
-
-    return (String[]) argsList.toArray(new String[argsList.size()]);
-  }
-
-  private Set computeStaleGrammars()
-    throws MojoExecutionException
-  {
-    SuffixMapping mapping = new SuffixMapping(".jj", ".jj");
-    SuffixMapping mappingCAP = new SuffixMapping(".JJ", ".JJ");
-
-    SourceInclusionScanner scanner = new StaleSourceScanner(staleMillis);
-
-    scanner.addSourceMapping(mapping);
-    scanner.addSourceMapping(mappingCAP);
-
-    Set staleSources = new HashSet();
-
-    File sourceDir = new File(sourceDirectory, sourcePath);
-
-    try
-    {
-      staleSources.addAll(scanner.getIncludedSources(sourceDir, 
-                                                     timestampDirectory));
-    }
-    catch (InclusionScanException e)
-    {
-      throw new MojoExecutionException("Error scanning source root: \'" + 
-                                       sourceDir + 
-                                       "\' for stale grammars to reprocess.", 
-                                       e);
-    }
-
-    return staleSources;
-  }
-
-
-}
-
diff --git a/maven2-plugins/myfaces-javacc-plugin/src/site/apt/index.apt b/maven2-plugins/myfaces-javacc-plugin/src/site/apt/index.apt
deleted file mode 100644
index 5fc2c3e..0000000
--- a/maven2-plugins/myfaces-javacc-plugin/src/site/apt/index.apt
+++ /dev/null
@@ -1,115 +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.
-~~
-
-------
- Maven 2 JavaCC plugin 
- ------
- <jruiz@exist.com>
- Jesse McConnell <jesse.mcconnell@gmail.com>
- ------
- July 27 2005
- ------
-
-Maven 2 JavaCC plugin
-
- This plugin is for processing javacc files into java sources.
-
- https://javacc.dev.java.net
-
- This plugin will process all *.jj files in the sourceDirectory into a 
- common generated sources output directory.  This will occur during the 
- generate-resources phase and the sources directory will be added to the project
- for the compile phase.
- 
-Available Configuration Options: (param - default value)
- 
- * sourceDirectory - src/main/javacc
- 
- * outputDirectory - target/generated-sources/javacc
- 
- * timestampDirectory - target (used so grammers are not constantly regenerated)
- 
- * lookAhead - 1
-
- * choiceAmbiguityCheck - 2
-
- * otherAmbiguityCheck - 1
-
- * isStatic - true
-
- * debugParser - false
-
- * debugLookAhead - false
-
- * debugTokenManager - false
-
- * optimizeTokenManager - true
-
- * errorReporting - true
-
- * javaUnicodeEscape - false
-
- * unicodeInput - false
-
- * ignoreCase - false
-
- * commonTokenAction - false
-
- * userTokenManager - false
-
- * userCharStream - false
-
- * buildParser - true
-
- * buildTokenManager - true
-
- * sanityCheck - true
-
- * forceLaCheck - false
-
- * cacheTokens - false
-
- * keepLineColumn - true
- 
- []
- 
-Usage:
-
--------------------
-<project>
-   ...
-      <build>
-         <plugins>
-            <plugin>
-               <groupId>org.apache.maven.plugins</groupId>
-               <artifactId>maven-javacc-plugin</artifactId>
-	       <version>1.0</version>
-	       <executions>
-	          <execution>
-	             <goals>
-	                <goal>generate</goal>
-	             </goals>
-	          </execution>
-	       </executions>
-            </plugin>
-         </plugins>
-         ...
-      </build>
-   ...
-</project>
--------------------
diff --git a/maven2-plugins/myfaces-javacc-plugin/src/site/site.xml b/maven2-plugins/myfaces-javacc-plugin/src/site/site.xml
deleted file mode 100644
index c266e9d..0000000
--- a/maven2-plugins/myfaces-javacc-plugin/src/site/site.xml
+++ /dev/null
@@ -1,41 +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.
-	   
--->
-<project name="Mojo">
-   <bannerLeft>
-      <name>Mojo</name>
-      <src>/images/mojo_logo.png</src>
-      <href>http://mojo.codehaus.org</href>
-   </bannerLeft>
-   <bannerRight>
-      <name>Codehaus</name>
-      <src>http://mojo.codehaus.org/images/codehaus-small.png</src>
-      <href>http://www.codehaus.org</href>
-   </bannerRight>
-   <body>
-      <links>
-         <item name="Mojo" href="http://mojo.codehaus.org"/>
-         <item name="Maven" href="http://maven.apache.org/maven2"/>
-      </links>
-      <menu name="Mojo">
-         <item name="mojo" href="http://mojo.codehaus.org"/>
-      </menu>
-      ${reports}
-   </body>
-</project>
diff --git a/maven2-plugins/myfaces-javacc-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/javacc/JavaCCMojoTest.java b/maven2-plugins/myfaces-javacc-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/javacc/JavaCCMojoTest.java
deleted file mode 100644
index bb86633..0000000
--- a/maven2-plugins/myfaces-javacc-plugin/src/test/java/org/apache/myfaces/buildtools/maven2/plugin/javacc/JavaCCMojoTest.java
+++ /dev/null
@@ -1,41 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javacc;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.StringTokenizer;
-
-import junit.framework.TestCase;
-
-
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.myfaces.buildtools.maven2.plugin.javacc.JavaCCMojo;
-
-
-public class JavaCCMojoTest extends TestCase
-{
-  public void testExecution() throws MojoExecutionException
-  {
-    JavaCCMojo mojo = new JavaCCMojo();
-    //TODO: write a test here...
-  }
-}
diff --git a/maven2-plugins/myfaces-javacc-plugin/src/test/resources/SelectorParser.jj b/maven2-plugins/myfaces-javacc-plugin/src/test/resources/SelectorParser.jj
deleted file mode 100644
index 6d06498..0000000
--- a/maven2-plugins/myfaces-javacc-plugin/src/test/resources/SelectorParser.jj
+++ /dev/null
@@ -1,578 +0,0 @@
-/** 
- * <a href="http://activemq.org">ActiveMQ: The Open Source Message Fabric</a>
- *
- * Copyright 2004 Hiram Chirino
- * Copyright 2004 Protique Ltd
- * 
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- * 
- *  http://www.apache.org/licenses/LICENSE-2.0
- * 
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- * 
- **/
-
-// ----------------------------------------------------------------------------
-// OPTIONS
-// ----------------------------------------------------------------------------
-options {
-  STATIC = true;
-  UNICODE_INPUT = false;
-  
-   //some performance optimizations
-  OPTIMIZE_TOKEN_MANAGER = false;
-  ERROR_REPORTING = true;
-}
-
-// ----------------------------------------------------------------------------
-// PARSER
-// ----------------------------------------------------------------------------
-
-PARSER_BEGIN(SelectorParser)
-
-package org.activemq.selector;
-
-import java.io.*;
-import java.util.*;
-
-import javax.jms.InvalidSelectorException;
-
-import org.activemq.filter.*;
-
-/** 
- * JMS Selector Parser generated by JavaCC
- * 
- * Do not edit this .java file directly - it is autogenerated from SelectorParser.jj
- */
-public class SelectorParser {
-
-    public SelectorParser() {
-        this(new StringReader(""));
-    }
-
-    public BooleanExpression parse(String sql) throws InvalidSelectorException {
-        this.ReInit(new StringReader(sql));
-
-        try {
-            return this.JmsSelector();
-        } 
-        catch (Throwable e) {
-	        throw (InvalidSelectorException)new InvalidSelectorException("test").initCause(e);
-        }
-        
-    }
-    
-    private BooleanExpression asBooleanExpression(Expression value) throws ParseException  {
-        if (value instanceof BooleanExpression) {
-            return (BooleanExpression) value;
-        }
-        if (value instanceof PropertyExpression) {
-            return UnaryExpression.createBooleanCast( value );
-        }
-        throw new ParseException("Expression will not result in a boolean value: " + value);
-    }
-    
-
-}
-
-PARSER_END(SelectorParser)
-
-// ----------------------------------------------------------------------------
-// Tokens
-// ----------------------------------------------------------------------------
-
-/* White Space */
-SPECIAL_TOKEN :
-{
-  " " | "\t" | "\n" | "\r" | "\f"
-}
-
-/* Comments */
-SKIP:
-{
-  <LINE_COMMENT: "--" (~["\n","\r"])* ("\n"|"\r"|"\r\n") >
-}
-
-SKIP:
-{
-  <BLOCK_COMMENT: "/*" (~["*"])* "*" ("*" | (~["*","/"] (~["*"])* "*"))* "/">
-}
-
-/* Reserved Words */
-TOKEN [IGNORE_CASE] :
-{
-    <  NOT     : "NOT">
-  | <  AND     : "AND">
-  | <  OR      : "OR">
-  | <  BETWEEN : "BETWEEN">
-  | <  LIKE    : "LIKE">
-  | <  ESCAPE  : "ESCAPE">
-  | <  IN      : "IN">
-  | <  IS      : "IS">
-  | <  TRUE    : "TRUE" >
-  | <  FALSE   : "FALSE" >
-  | <  NULL    : "NULL" >
-  | <  XPATH   : "XPATH" >
-  | <  XQUERY  : "XQUERY" >
-}
-
-/* Literals */
-TOKEN [IGNORE_CASE] :
-{
-
-    < DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* (["l","L"])? >
-  | < HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ >
-  | < OCTAL_LITERAL: "0" (["0"-"7"])* >  
-  | < FLOATING_POINT_LITERAL:  		  
-          (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? // matches: 5.5 or 5. or 5.5E10 or 5.E10
-        | "." (["0"-"9"])+ (<EXPONENT>)?              // matches: .5 or .5E10
-        | (["0"-"9"])+ <EXPONENT>                     // matches: 5E10
-    >
-  | < #EXPONENT: "E" (["+","-"])? (["0"-"9"])+ >
-  | < STRING_LITERAL: "'" ( ("''") | ~["'"] )*  "'" >
-}
-
-TOKEN [IGNORE_CASE] :
-{
-    < ID : ["a"-"z", "_", "$"] (["a"-"z","0"-"9","_", "$"])* >
-}
-
-// ----------------------------------------------------------------------------
-// Grammer
-// ----------------------------------------------------------------------------
-BooleanExpression JmsSelector() :
-{
-    Expression left=null;
-}
-{
-    (
-        left = orExpression()
-    ) 
-    {
-        return asBooleanExpression(left);
-    }
-
-}
-
-Expression orExpression() :
-{
-    Expression left;
-    Expression right;
-}
-{
-    (
-        left = andExpression() 
-        ( 
-            <OR> right = andExpression() 
-            {
-                left = LogicExpression.createOR(asBooleanExpression(left), asBooleanExpression(right));
-            }
-        )*
-    ) 
-    {
-        return left;
-    }
-
-}
-
-
-Expression andExpression() :
-{
-    Expression left;
-    Expression right;
-}
-{
-    (
-        left = equalityExpression() 
-        ( 
-            <AND> right = equalityExpression() 
-            {
-                left = LogicExpression.createAND(asBooleanExpression(left), asBooleanExpression(right));
-            }
-        )*
-    ) 
-    {
-        return left;
-    }
-}
-
-Expression equalityExpression() :
-{
-    Expression left;
-    Expression right;
-}
-{
-    (
-        left = comparisonExpression() 
-        ( 
-            
-            "=" right = comparisonExpression() 
-            {
-                left = ComparisonExpression.createEqual(left, right);
-            }
-            |            
-            "<>" right = comparisonExpression() 
-            {
-                left = ComparisonExpression.createNotEqual(left, right);
-            }
-            |            
-            LOOKAHEAD(2)
-            <IS> <NULL>
-            {
-                left = ComparisonExpression.createIsNull(left);
-            }
-            |            
-            <IS> <NOT> <NULL>
-            {
-                left = ComparisonExpression.createIsNotNull(left);
-            }
-        )*
-    ) 
-    {
-        return left;
-    }
-}
-
-Expression comparisonExpression() :
-{
-    Expression left;
-    Expression right;
-    Expression low;
-    Expression high;
-    String t, u;
-	boolean not;
-	ArrayList list;
-}
-{
-    (
-        left = addExpression() 
-        ( 
-            
-                ">" right = addExpression() 
-                {
-                    left = ComparisonExpression.createGreaterThan(left, right);
-                }
-            |            
-                ">=" right = addExpression() 
-                {
-                    left = ComparisonExpression.createGreaterThanEqual(left, right);
-                }
-            |            
-                "<" right = addExpression() 
-                {
-                    left = ComparisonExpression.createLessThan(left, right);
-                }
-            |            
-                "<=" right = addExpression() 
-                {
-                    left = ComparisonExpression.createLessThanEqual(left, right);
-                }
-           |
-				{
-					u=null;
-				}           		
-		        <LIKE> t = stringLitteral() 
-		        	[ <ESCAPE> u = stringLitteral() ]
-		        {
-                    left = ComparisonExpression.createLike(left, t, u);
-		        }
-           |
-	        	LOOKAHEAD(2)
-				{
-					u=null;
-				}           		
-		        <NOT> <LIKE> t = stringLitteral() [ <ESCAPE> u = stringLitteral() ]
-		        {
-                    left = ComparisonExpression.createNotLike(left, t, u);
-		        }
-            |
-		        <BETWEEN> low = addExpression() <AND> high = addExpression()
-		        {
-					left = ComparisonExpression.createBetween(left, low, high);
-		        }
-	        |
-	        	LOOKAHEAD(2)
-		        <NOT> <BETWEEN> low = addExpression() <AND> high = addExpression()
-		        {
-					left = ComparisonExpression.createNotBetween(left, low, high);
-		        }
-            |
-				<IN> 
-		        "(" 
-		            t = stringLitteral()
-		            {
-			            list = new ArrayList();
-			            list.add( t );
-		            }
-			        ( 
-			        	","
-			            t = stringLitteral() 
-			            {
-				            list.add( t );
-			            }
-			        	
-			        )*
-		        ")"
-		        {
-		           left = ComparisonExpression.createInFilter(left, list);
-		        }
-            |
-	        	LOOKAHEAD(2)
-	            <NOT> <IN> 
-		        "(" 
-		            t = stringLitteral()
-		            {
-			            list = new ArrayList();
-			            list.add( t );
-		            }
-			        ( 
-			        	","
-			            t = stringLitteral() 
-			            {
-				            list.add( t );
-			            }
-			        	
-			        )*
-		        ")"
-		        {
-		           left = ComparisonExpression.createNotInFilter(left, list);
-		        }
-            
-        )*
-    ) 
-    {
-        return left;
-    }
-}
-
-Expression addExpression() :
-{
-    Expression left;
-    Expression right;
-}
-{
-    left = multExpr() 
-    ( 
-	    LOOKAHEAD( ("+"|"-") multExpr())
-	    (
-	        "+" right = multExpr() 
-	        {
-	            left = ArithmeticExpression.createPlus(left, right);
-	        }
-	        |            
-	        "-" right = multExpr() 
-	        {
-	            left = ArithmeticExpression.createMinus(left, right);
-	        }
-        )
-        
-    )*
-    {
-        return left;
-    }
-}
-
-Expression multExpr() :
-{
-    Expression left;
-    Expression right;
-}
-{
-    left = unaryExpr() 
-    ( 
-        "*" right = unaryExpr() 
-        {
-	        left = ArithmeticExpression.createMultiply(left, right);
-        }
-        |            
-        "/" right = unaryExpr() 
-        {
-	        left = ArithmeticExpression.createDivide(left, right);
-        }
-        |            
-        "%" right = unaryExpr() 
-        {
-	        left = ArithmeticExpression.createMod(left, right);
-        }
-        
-    )*
-    {
-        return left;
-    }
-}
-
-
-Expression unaryExpr() :
-{
-    String s=null;
-    Expression left=null;
-}
-{
-	(
-		LOOKAHEAD( "+" unaryExpr() )
-	    "+" left=unaryExpr()
-	    |
-	    "-" left=unaryExpr()
-	    {
-	        left = UnaryExpression.createNegate(left);
-	    }
-	    |
-	    <NOT> left=unaryExpr()
-	    {
-		    left = UnaryExpression.createNOT( asBooleanExpression(left) );
-	    }
-	    |
-	    <XPATH> s=stringLitteral()
-	    {
-		    left = UnaryExpression.createXPath( s );
-	    }
-	    |
-	    <XQUERY> s=stringLitteral()
-	    {
-		    left = UnaryExpression.createXQuery( s );
-	    }
-	    |
-	    left = primaryExpr()
-    )
-    {
-        return left;
-    }
-
-}
-
-Expression primaryExpr() :
-{
-    Expression left=null;
-}
-{
-    (
-        left = literal()
-        |
-        left = variable()
-        |
-        "(" left = orExpression() ")"
-    ) 
-    {
-        return left;
-    }
-}
-
-
-
-ConstantExpression literal() :
-{
-    Token t;
-    String s;
-    ConstantExpression left=null;
-}
-{
-    (
-        (
-            s = stringLitteral()
-            {
-                left = new ConstantExpression(s);
-            }
-        ) 
-        | 
-        (
-            t = <DECIMAL_LITERAL>
-            {
-            	left = ConstantExpression.createFromDecimal(t.image);
-            }    
-        ) 
-        | 
-        (
-            t = <HEX_LITERAL>
-            {
-            	left = ConstantExpression.createFromHex(t.image);
-            }    
-        ) 
-        | 
-        (
-            t = <OCTAL_LITERAL>
-            {
-            	left = ConstantExpression.createFromOctal(t.image);
-            }    
-        ) 
-        | 
-        (
-            t = <FLOATING_POINT_LITERAL>
-            {
-            	left = ConstantExpression.createFloat(t.image);
-            }    
-        ) 
-        | 
-        (
-            <TRUE>
-            {
-                left = ConstantExpression.TRUE;
-            }    
-        ) 
-        | 
-        (
-            <FALSE>
-            {
-                left = ConstantExpression.FALSE;
-            }    
-        ) 
-        | 
-        (
-            <NULL>
-            {
-                left = ConstantExpression.NULL;
-            }    
-        )
-    )
-    {
-        return left;
-    }
-}
-
-String stringLitteral() :
-{
-    Token t;
-    StringBuffer rc = new StringBuffer();
-    boolean first=true;
-}
-{
-    t = <STRING_LITERAL> 
-    {
-    	// Decode the sting value.
-    	String image = t.image;
-    	for( int i=1; i < image.length()-1; i++ ) {
-    		char c = image.charAt(i);
-    		if( c == '\'' )
-    			i++;    			
-   			rc.append(c);
-    	}
-	    return rc.toString();
-    }    
-}
-
-PropertyExpression variable() :
-{
-    Token t;
-    PropertyExpression left=null;
-}
-{
-    ( 
-        t = <ID> 
-        {
-            left = new PropertyExpression(t.image);
-        }    
-    )
-    {
-        return left;
-    }
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/ParseException.java b/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/ParseException.java
deleted file mode 100644
index 35a2630..0000000
--- a/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/ParseException.java
+++ /dev/null
@@ -1,210 +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.
- */
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */
-package org.activemq.selector;
-
-/**
- * This exception is thrown when parse errors are encountered.
- * You can explicitly create objects of this exception type by
- * calling the method generateParseException in the generated
- * parser.
- *
- * You can modify this class to customize your error reporting
- * mechanisms so long as you retain the public fields.
- */
-public class ParseException extends Exception {
-
-  /**
-   * This constructor is used by the method "generateParseException"
-   * in the generated parser.  Calling this constructor generates
-   * a new object of this type with the fields "currentToken",
-   * "expectedTokenSequences", and "tokenImage" set.  The boolean
-   * flag "specialConstructor" is also set to true to indicate that
-   * this constructor was used to create this object.
-   * This constructor calls its super class with the empty string
-   * to force the "toString" method of parent class "Throwable" to
-   * print the error message in the form:
-   *     ParseException: <result of getMessage>
-   */
-  public ParseException(Token currentTokenVal,
-                        int[][] expectedTokenSequencesVal,
-                        String[] tokenImageVal
-                       )
-  {
-    super("");
-    specialConstructor = true;
-    currentToken = currentTokenVal;
-    expectedTokenSequences = expectedTokenSequencesVal;
-    tokenImage = tokenImageVal;
-  }
-
-  /**
-   * The following constructors are for use by you for whatever
-   * purpose you can think of.  Constructing the exception in this
-   * manner makes the exception behave in the normal way - i.e., as
-   * documented in the class "Throwable".  The fields "errorToken",
-   * "expectedTokenSequences", and "tokenImage" do not contain
-   * relevant information.  The JavaCC generated code does not use
-   * these constructors.
-   */
-
-  public ParseException() {
-    super();
-    specialConstructor = false;
-  }
-
-  public ParseException(String message) {
-    super(message);
-    specialConstructor = false;
-  }
-
-  /**
-   * This variable determines which constructor was used to create
-   * this object and thereby affects the semantics of the
-   * "getMessage" method (see below).
-   */
-  protected boolean specialConstructor;
-
-  /**
-   * This is the last token that has been consumed successfully.  If
-   * this object has been created due to a parse error, the token
-   * followng this token will (therefore) be the first error token.
-   */
-  public Token currentToken;
-
-  /**
-   * Each entry in this array is an array of integers.  Each array
-   * of integers represents a sequence of tokens (by their ordinal
-   * values) that is expected at this point of the parse.
-   */
-  public int[][] expectedTokenSequences;
-
-  /**
-   * This is a reference to the "tokenImage" array of the generated
-   * parser within which the parse error occurred.  This array is
-   * defined in the generated ...Constants interface.
-   */
-  public String[] tokenImage;
-
-  /**
-   * This method has the standard behavior when this object has been
-   * created using the standard constructors.  Otherwise, it uses
-   * "currentToken" and "expectedTokenSequences" to generate a parse
-   * error message and returns it.  If this object has been created
-   * due to a parse error, and you do not catch it (it gets thrown
-   * from the parser), then this method is called during the printing
-   * of the final stack trace, and hence the correct error message
-   * gets displayed.
-   */
-  public String getMessage() {
-    if (!specialConstructor) {
-      return super.getMessage();
-    }
-    String expected = "";
-    int maxSize = 0;
-    for (int i = 0; i < expectedTokenSequences.length; i++) {
-      if (maxSize < expectedTokenSequences[i].length) {
-        maxSize = expectedTokenSequences[i].length;
-      }
-      for (int j = 0; j < expectedTokenSequences[i].length; j++) {
-        expected += tokenImage[expectedTokenSequences[i][j]] + " ";
-      }
-      if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
-        expected += "...";
-      }
-      expected += eol + "    ";
-    }
-    String retval = "Encountered \"";
-    Token tok = currentToken.next;
-    for (int i = 0; i < maxSize; i++) {
-      if (i != 0) retval += " ";
-      if (tok.kind == 0) {
-        retval += tokenImage[0];
-        break;
-      }
-      retval += add_escapes(tok.image);
-      tok = tok.next; 
-    }
-    retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
-    retval += "." + eol;
-    if (expectedTokenSequences.length == 1) {
-      retval += "Was expecting:" + eol + "    ";
-    } else {
-      retval += "Was expecting one of:" + eol + "    ";
-    }
-    retval += expected;
-    return retval;
-  }
-
-  /**
-   * The end of line string for this machine.
-   */
-  protected String eol = System.getProperty("line.separator", "\n");
- 
-  /**
-   * Used to convert raw characters to their escaped version
-   * when these raw version cannot be used as part of an ASCII
-   * string literal.
-   */
-  protected String add_escapes(String str) {
-      StringBuffer retval = new StringBuffer();
-      char ch;
-      for (int i = 0; i < str.length(); i++) {
-        switch (str.charAt(i))
-        {
-           case 0 :
-              continue;
-           case '\b':
-              retval.append("\\b");
-              continue;
-           case '\t':
-              retval.append("\\t");
-              continue;
-           case '\n':
-              retval.append("\\n");
-              continue;
-           case '\f':
-              retval.append("\\f");
-              continue;
-           case '\r':
-              retval.append("\\r");
-              continue;
-           case '\"':
-              retval.append("\\\"");
-              continue;
-           case '\'':
-              retval.append("\\\'");
-              continue;
-           case '\\':
-              retval.append("\\\\");
-              continue;
-           default:
-              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-                 String s = "0000" + Integer.toString(ch, 16);
-                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-              } else {
-                 retval.append(ch);
-              }
-              continue;
-        }
-      }
-      return retval.toString();
-   }
-
-}
diff --git a/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/SelectorParser.java b/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/SelectorParser.java
deleted file mode 100644
index ceb5958..0000000
--- a/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/SelectorParser.java
+++ /dev/null
@@ -1,1181 +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.
- */
-/* Generated By:JavaCC: Do not edit this line. SelectorParser.java */
-package org.activemq.selector;
-
-import java.io.*;
-import java.util.*;
-
-import javax.jms.InvalidSelectorException;
-
-import org.activemq.filter.*;
-
-/** 
- * JMS Selector Parser generated by JavaCC
- * 
- * Do not edit this .java file directly - it is autogenerated from SelectorParser.jj
- */
-public class SelectorParser implements SelectorParserConstants {
-
-    public SelectorParser() {
-        this(new StringReader(""));
-    }
-
-    public BooleanExpression parse(String sql) throws InvalidSelectorException {
-        this.ReInit(new StringReader(sql));
-
-        try {
-            return this.JmsSelector();
-        }
-        catch (Throwable e) {
-                throw (InvalidSelectorException)new InvalidSelectorException("test").initCause(e);
-        }
-
-    }
-
-    private BooleanExpression asBooleanExpression(Expression value) throws ParseException  {
-        if (value instanceof BooleanExpression) {
-            return (BooleanExpression) value;
-        }
-        if (value instanceof PropertyExpression) {
-            return UnaryExpression.createBooleanCast( value );
-        }
-        throw new ParseException("Expression will not result in a boolean value: " + value);
-    }
-
-// ----------------------------------------------------------------------------
-// Grammer
-// ----------------------------------------------------------------------------
-  final public BooleanExpression JmsSelector() throws ParseException {
-    Expression left=null;
-    left = orExpression();
-        {if (true) return asBooleanExpression(left);}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public Expression orExpression() throws ParseException {
-    Expression left;
-    Expression right;
-    left = andExpression();
-    label_1:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case OR:
-        ;
-        break;
-      default:
-        break label_1;
-      }
-      jj_consume_token(OR);
-      right = andExpression();
-                left = LogicExpression.createOR(asBooleanExpression(left), asBooleanExpression(right));
-    }
-        {if (true) return left;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public Expression andExpression() throws ParseException {
-    Expression left;
-    Expression right;
-    left = equalityExpression();
-    label_2:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case AND:
-        ;
-        break;
-      default:
-        break label_2;
-      }
-      jj_consume_token(AND);
-      right = equalityExpression();
-                left = LogicExpression.createAND(asBooleanExpression(left), asBooleanExpression(right));
-    }
-        {if (true) return left;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public Expression equalityExpression() throws ParseException {
-    Expression left;
-    Expression right;
-    left = comparisonExpression();
-    label_3:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IS:
-      case 28:
-      case 29:
-        ;
-        break;
-      default:
-        break label_3;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case 28:
-        jj_consume_token(28);
-        right = comparisonExpression();
-                left = ComparisonExpression.createEqual(left, right);
-        break;
-      case 29:
-        jj_consume_token(29);
-        right = comparisonExpression();
-                left = ComparisonExpression.createNotEqual(left, right);
-        break;
-      default:
-        if (jj_2_1(2)) {
-          jj_consume_token(IS);
-          jj_consume_token(NULL);
-                left = ComparisonExpression.createIsNull(left);
-        } else {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case IS:
-            jj_consume_token(IS);
-            jj_consume_token(NOT);
-            jj_consume_token(NULL);
-                left = ComparisonExpression.createIsNotNull(left);
-            break;
-          default:
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-        }
-      }
-    }
-        {if (true) return left;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public Expression comparisonExpression() throws ParseException {
-    Expression left;
-    Expression right;
-    Expression low;
-    Expression high;
-    String t, u;
-        boolean not;
-        ArrayList list;
-    left = addExpression();
-    label_4:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case NOT:
-      case BETWEEN:
-      case LIKE:
-      case IN:
-      case 30:
-      case 31:
-      case 32:
-      case 33:
-        ;
-        break;
-      default:
-        break label_4;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case 30:
-        jj_consume_token(30);
-        right = addExpression();
-                    left = ComparisonExpression.createGreaterThan(left, right);
-        break;
-      case 31:
-        jj_consume_token(31);
-        right = addExpression();
-                    left = ComparisonExpression.createGreaterThanEqual(left, right);
-        break;
-      case 32:
-        jj_consume_token(32);
-        right = addExpression();
-                    left = ComparisonExpression.createLessThan(left, right);
-        break;
-      case 33:
-        jj_consume_token(33);
-        right = addExpression();
-                    left = ComparisonExpression.createLessThanEqual(left, right);
-        break;
-      case LIKE:
-                                        u=null;
-        jj_consume_token(LIKE);
-        t = stringLitteral();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ESCAPE:
-          jj_consume_token(ESCAPE);
-          u = stringLitteral();
-          break;
-        default:
-          ;
-        }
-                    left = ComparisonExpression.createLike(left, t, u);
-        break;
-      default:
-        if (jj_2_2(2)) {
-                                        u=null;
-          jj_consume_token(NOT);
-          jj_consume_token(LIKE);
-          t = stringLitteral();
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case ESCAPE:
-            jj_consume_token(ESCAPE);
-            u = stringLitteral();
-            break;
-          default:
-            ;
-          }
-                    left = ComparisonExpression.createNotLike(left, t, u);
-        } else {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case BETWEEN:
-            jj_consume_token(BETWEEN);
-            low = addExpression();
-            jj_consume_token(AND);
-            high = addExpression();
-                                        left = ComparisonExpression.createBetween(left, low, high);
-            break;
-          default:
-            if (jj_2_3(2)) {
-              jj_consume_token(NOT);
-              jj_consume_token(BETWEEN);
-              low = addExpression();
-              jj_consume_token(AND);
-              high = addExpression();
-                                        left = ComparisonExpression.createNotBetween(left, low, high);
-            } else {
-              switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-              case IN:
-                jj_consume_token(IN);
-                jj_consume_token(34);
-                t = stringLitteral();
-                                    list = new ArrayList();
-                                    list.add( t );
-                label_5:
-                while (true) {
-                  switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-                  case 35:
-                    ;
-                    break;
-                  default:
-                    break label_5;
-                  }
-                  jj_consume_token(35);
-                  t = stringLitteral();
-                                            list.add( t );
-                }
-                jj_consume_token(36);
-                           left = ComparisonExpression.createInFilter(left, list);
-                break;
-              default:
-                if (jj_2_4(2)) {
-                  jj_consume_token(NOT);
-                  jj_consume_token(IN);
-                  jj_consume_token(34);
-                  t = stringLitteral();
-                                    list = new ArrayList();
-                                    list.add( t );
-                  label_6:
-                  while (true) {
-                    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-                    case 35:
-                      ;
-                      break;
-                    default:
-                      break label_6;
-                    }
-                    jj_consume_token(35);
-                    t = stringLitteral();
-                                            list.add( t );
-                  }
-                  jj_consume_token(36);
-                           left = ComparisonExpression.createNotInFilter(left, list);
-                } else {
-                  jj_consume_token(-1);
-                  throw new ParseException();
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-        {if (true) return left;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public Expression addExpression() throws ParseException {
-    Expression left;
-    Expression right;
-    left = multExpr();
-    label_7:
-    while (true) {
-      if (jj_2_5(2147483647)) {
-        ;
-      } else {
-        break label_7;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case 37:
-        jj_consume_token(37);
-        right = multExpr();
-                    left = ArithmeticExpression.createPlus(left, right);
-        break;
-      case 38:
-        jj_consume_token(38);
-        right = multExpr();
-                    left = ArithmeticExpression.createMinus(left, right);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-        {if (true) return left;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public Expression multExpr() throws ParseException {
-    Expression left;
-    Expression right;
-    left = unaryExpr();
-    label_8:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case 39:
-      case 40:
-      case 41:
-        ;
-        break;
-      default:
-        break label_8;
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case 39:
-        jj_consume_token(39);
-        right = unaryExpr();
-                left = ArithmeticExpression.createMultiply(left, right);
-        break;
-      case 40:
-        jj_consume_token(40);
-        right = unaryExpr();
-                left = ArithmeticExpression.createDivide(left, right);
-        break;
-      case 41:
-        jj_consume_token(41);
-        right = unaryExpr();
-                left = ArithmeticExpression.createMod(left, right);
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-        {if (true) return left;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public Expression unaryExpr() throws ParseException {
-    String s=null;
-    Expression left=null;
-    if (jj_2_6(2147483647)) {
-      jj_consume_token(37);
-      left = unaryExpr();
-    } else {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case 38:
-        jj_consume_token(38);
-        left = unaryExpr();
-                left = UnaryExpression.createNegate(left);
-        break;
-      case NOT:
-        jj_consume_token(NOT);
-        left = unaryExpr();
-                    left = UnaryExpression.createNOT( asBooleanExpression(left) );
-        break;
-      case XPATH:
-        jj_consume_token(XPATH);
-        s = stringLitteral();
-                    left = UnaryExpression.createXPath( s );
-        break;
-      case XQUERY:
-        jj_consume_token(XQUERY);
-        s = stringLitteral();
-                    left = UnaryExpression.createXQuery( s );
-        break;
-      case TRUE:
-      case FALSE:
-      case NULL:
-      case DECIMAL_LITERAL:
-      case HEX_LITERAL:
-      case OCTAL_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case ID:
-      case 34:
-        left = primaryExpr();
-        break;
-      default:
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    }
-        {if (true) return left;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public Expression primaryExpr() throws ParseException {
-    Expression left=null;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case TRUE:
-    case FALSE:
-    case NULL:
-    case DECIMAL_LITERAL:
-    case HEX_LITERAL:
-    case OCTAL_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case STRING_LITERAL:
-      left = literal();
-      break;
-    case ID:
-      left = variable();
-      break;
-    case 34:
-      jj_consume_token(34);
-      left = orExpression();
-      jj_consume_token(36);
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-        {if (true) return left;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public ConstantExpression literal() throws ParseException {
-    Token t;
-    String s;
-    ConstantExpression left=null;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case STRING_LITERAL:
-      s = stringLitteral();
-                left = new ConstantExpression(s);
-      break;
-    case DECIMAL_LITERAL:
-      t = jj_consume_token(DECIMAL_LITERAL);
-                left = ConstantExpression.createFromDecimal(t.image);
-      break;
-    case HEX_LITERAL:
-      t = jj_consume_token(HEX_LITERAL);
-                left = ConstantExpression.createFromHex(t.image);
-      break;
-    case OCTAL_LITERAL:
-      t = jj_consume_token(OCTAL_LITERAL);
-                left = ConstantExpression.createFromOctal(t.image);
-      break;
-    case FLOATING_POINT_LITERAL:
-      t = jj_consume_token(FLOATING_POINT_LITERAL);
-                left = ConstantExpression.createFloat(t.image);
-      break;
-    case TRUE:
-      jj_consume_token(TRUE);
-                left = ConstantExpression.TRUE;
-      break;
-    case FALSE:
-      jj_consume_token(FALSE);
-                left = ConstantExpression.FALSE;
-      break;
-    case NULL:
-      jj_consume_token(NULL);
-                left = ConstantExpression.NULL;
-      break;
-    default:
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-        {if (true) return left;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public String stringLitteral() throws ParseException {
-    Token t;
-    StringBuffer rc = new StringBuffer();
-    boolean first=true;
-    t = jj_consume_token(STRING_LITERAL);
-        // Decode the sting value.
-        String image = t.image;
-        for( int i=1; i < image.length()-1; i++ ) {
-                char c = image.charAt(i);
-                if( c == '\'' )
-                        i++;
-                        rc.append(c);
-        }
-            {if (true) return rc.toString();}
-    throw new Error("Missing return statement in function");
-  }
-
-  final public PropertyExpression variable() throws ParseException {
-    Token t;
-    PropertyExpression left=null;
-    t = jj_consume_token(ID);
-            left = new PropertyExpression(t.image);
-        {if (true) return left;}
-    throw new Error("Missing return statement in function");
-  }
-
-  final private boolean jj_2_1(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_1(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  final private boolean jj_2_2(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_2(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  final private boolean jj_2_3(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_3(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  final private boolean jj_2_4(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_4(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  final private boolean jj_2_5(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_5(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  final private boolean jj_2_6(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_6(); }
-    catch(LookaheadSuccess ls) { return true; }
-  }
-
-  final private boolean jj_3R_51() {
-    if (jj_scan_token(32)) return true;
-    if (jj_3R_43()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_27() {
-    if (jj_scan_token(ID)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_61() {
-    if (jj_scan_token(35)) return true;
-    if (jj_3R_21()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_48() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_56()) {
-    jj_scanpos = xsp;
-    if (jj_3R_57()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_38() {
-    if (jj_scan_token(OR)) return true;
-    if (jj_3R_37()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_50() {
-    if (jj_scan_token(31)) return true;
-    if (jj_3R_43()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_25() {
-    if (jj_scan_token(34)) return true;
-    if (jj_3R_28()) return true;
-    if (jj_scan_token(36)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_24() {
-    if (jj_3R_27()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_49() {
-    if (jj_scan_token(30)) return true;
-    if (jj_3R_43()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_44() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_49()) {
-    jj_scanpos = xsp;
-    if (jj_3R_50()) {
-    jj_scanpos = xsp;
-    if (jj_3R_51()) {
-    jj_scanpos = xsp;
-    if (jj_3R_52()) {
-    jj_scanpos = xsp;
-    if (jj_3R_53()) {
-    jj_scanpos = xsp;
-    if (jj_3_2()) {
-    jj_scanpos = xsp;
-    if (jj_3R_54()) {
-    jj_scanpos = xsp;
-    if (jj_3_3()) {
-    jj_scanpos = xsp;
-    if (jj_3R_55()) {
-    jj_scanpos = xsp;
-    if (jj_3_4()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_23() {
-    if (jj_3R_26()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_43() {
-    if (jj_3R_9()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_48()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_28() {
-    if (jj_3R_37()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_38()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_22() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_23()) {
-    jj_scanpos = xsp;
-    if (jj_3R_24()) {
-    jj_scanpos = xsp;
-    if (jj_3R_25()) return true;
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_17() {
-    if (jj_3R_22()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_21() {
-    if (jj_scan_token(STRING_LITERAL)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_60() {
-    if (jj_scan_token(35)) return true;
-    if (jj_3R_21()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_16() {
-    if (jj_scan_token(XQUERY)) return true;
-    if (jj_3R_21()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_41() {
-    if (jj_3R_43()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_44()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_59() {
-    if (jj_scan_token(ESCAPE)) return true;
-    if (jj_3R_21()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_4() {
-    if (jj_scan_token(NOT)) return true;
-    if (jj_scan_token(IN)) return true;
-    if (jj_scan_token(34)) return true;
-    if (jj_3R_21()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_61()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(36)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_6() {
-    if (jj_scan_token(37)) return true;
-    if (jj_3R_10()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_15() {
-    if (jj_scan_token(XPATH)) return true;
-    if (jj_3R_21()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_14() {
-    if (jj_scan_token(NOT)) return true;
-    if (jj_3R_10()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_36() {
-    if (jj_scan_token(NULL)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_12() {
-    if (jj_scan_token(37)) return true;
-    if (jj_3R_10()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_55() {
-    if (jj_scan_token(IN)) return true;
-    if (jj_scan_token(34)) return true;
-    if (jj_3R_21()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_60()) { jj_scanpos = xsp; break; }
-    }
-    if (jj_scan_token(36)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_47() {
-    if (jj_scan_token(IS)) return true;
-    if (jj_scan_token(NOT)) return true;
-    if (jj_scan_token(NULL)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_13() {
-    if (jj_scan_token(38)) return true;
-    if (jj_3R_10()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_35() {
-    if (jj_scan_token(FALSE)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_1() {
-    if (jj_scan_token(IS)) return true;
-    if (jj_scan_token(NULL)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_10() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_12()) {
-    jj_scanpos = xsp;
-    if (jj_3R_13()) {
-    jj_scanpos = xsp;
-    if (jj_3R_14()) {
-    jj_scanpos = xsp;
-    if (jj_3R_15()) {
-    jj_scanpos = xsp;
-    if (jj_3R_16()) {
-    jj_scanpos = xsp;
-    if (jj_3R_17()) return true;
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_34() {
-    if (jj_scan_token(TRUE)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_46() {
-    if (jj_scan_token(29)) return true;
-    if (jj_3R_41()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_3() {
-    if (jj_scan_token(NOT)) return true;
-    if (jj_scan_token(BETWEEN)) return true;
-    if (jj_3R_43()) return true;
-    if (jj_scan_token(AND)) return true;
-    if (jj_3R_43()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_45() {
-    if (jj_scan_token(28)) return true;
-    if (jj_3R_41()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_42() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_45()) {
-    jj_scanpos = xsp;
-    if (jj_3R_46()) {
-    jj_scanpos = xsp;
-    if (jj_3_1()) {
-    jj_scanpos = xsp;
-    if (jj_3R_47()) return true;
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_33() {
-    if (jj_scan_token(FLOATING_POINT_LITERAL)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_54() {
-    if (jj_scan_token(BETWEEN)) return true;
-    if (jj_3R_43()) return true;
-    if (jj_scan_token(AND)) return true;
-    if (jj_3R_43()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_58() {
-    if (jj_scan_token(ESCAPE)) return true;
-    if (jj_3R_21()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_32() {
-    if (jj_scan_token(OCTAL_LITERAL)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_20() {
-    if (jj_scan_token(41)) return true;
-    if (jj_3R_10()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_39() {
-    if (jj_3R_41()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_42()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3_2() {
-    if (jj_scan_token(NOT)) return true;
-    if (jj_scan_token(LIKE)) return true;
-    if (jj_3R_21()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_59()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_53() {
-    if (jj_scan_token(LIKE)) return true;
-    if (jj_3R_21()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_58()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_31() {
-    if (jj_scan_token(HEX_LITERAL)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_19() {
-    if (jj_scan_token(40)) return true;
-    if (jj_3R_10()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_18() {
-    if (jj_scan_token(39)) return true;
-    if (jj_3R_10()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_11() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_18()) {
-    jj_scanpos = xsp;
-    if (jj_3R_19()) {
-    jj_scanpos = xsp;
-    if (jj_3R_20()) return true;
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_40() {
-    if (jj_scan_token(AND)) return true;
-    if (jj_3R_39()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_30() {
-    if (jj_scan_token(DECIMAL_LITERAL)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_9() {
-    if (jj_3R_10()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_11()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_29() {
-    if (jj_3R_21()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_57() {
-    if (jj_scan_token(38)) return true;
-    if (jj_3R_9()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_37() {
-    if (jj_3R_39()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_40()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3_5() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(37)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(38)) return true;
-    }
-    if (jj_3R_9()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_26() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_29()) {
-    jj_scanpos = xsp;
-    if (jj_3R_30()) {
-    jj_scanpos = xsp;
-    if (jj_3R_31()) {
-    jj_scanpos = xsp;
-    if (jj_3R_32()) {
-    jj_scanpos = xsp;
-    if (jj_3R_33()) {
-    jj_scanpos = xsp;
-    if (jj_3R_34()) {
-    jj_scanpos = xsp;
-    if (jj_3R_35()) {
-    jj_scanpos = xsp;
-    if (jj_3R_36()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_52() {
-    if (jj_scan_token(33)) return true;
-    if (jj_3R_43()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_56() {
-    if (jj_scan_token(37)) return true;
-    if (jj_3R_9()) return true;
-    return false;
-  }
-
-  public SelectorParserTokenManager token_source;
-  SimpleCharStream jj_input_stream;
-  public Token token, jj_nt;
-  private int jj_ntk;
-  private Token jj_scanpos, jj_lastpos;
-  private int jj_la;
-  public boolean lookingAhead = false;
-  private boolean jj_semLA;
-
-  public SelectorParser(java.io.InputStream stream) {
-    jj_input_stream = new SimpleCharStream(stream, 1, 1);
-    token_source = new SelectorParserTokenManager(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  public void ReInit(java.io.InputStream stream) {
-    jj_input_stream.ReInit(stream, 1, 1);
-    token_source.ReInit(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  public SelectorParser(java.io.Reader stream) {
-    jj_input_stream = new SimpleCharStream(stream, 1, 1);
-    token_source = new SelectorParserTokenManager(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  public void ReInit(java.io.Reader stream) {
-    jj_input_stream.ReInit(stream, 1, 1);
-    token_source.ReInit(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  public SelectorParser(SelectorParserTokenManager tm) {
-    token_source = tm;
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  public void ReInit(SelectorParserTokenManager tm) {
-    token_source = tm;
-    token = new Token();
-    jj_ntk = -1;
-  }
-
-  final private Token jj_consume_token(int kind) throws ParseException {
-    Token oldToken;
-    if ((oldToken = token).next != null) token = token.next;
-    else token = token.next = token_source.getNextToken();
-    jj_ntk = -1;
-    if (token.kind == kind) {
-      return token;
-    }
-    token = oldToken;
-    throw generateParseException();
-  }
-
-  static private final class LookaheadSuccess extends java.lang.Error { }
-  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
-  final private boolean jj_scan_token(int kind) {
-    if (jj_scanpos == jj_lastpos) {
-      jj_la--;
-      if (jj_scanpos.next == null) {
-        jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
-      } else {
-        jj_lastpos = jj_scanpos = jj_scanpos.next;
-      }
-    } else {
-      jj_scanpos = jj_scanpos.next;
-    }
-    if (jj_scanpos.kind != kind) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
-    return false;
-  }
-
-  final public Token getNextToken() {
-    if (token.next != null) token = token.next;
-    else token = token.next = token_source.getNextToken();
-    jj_ntk = -1;
-    return token;
-  }
-
-  final public Token getToken(int index) {
-    Token t = lookingAhead ? jj_scanpos : token;
-    for (int i = 0; i < index; i++) {
-      if (t.next != null) t = t.next;
-      else t = t.next = token_source.getNextToken();
-    }
-    return t;
-  }
-
-  final private int jj_ntk() {
-    if ((jj_nt=token.next) == null)
-      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
-    else
-      return (jj_ntk = jj_nt.kind);
-  }
-
-  public ParseException generateParseException() {
-    Token errortok = token.next;
-    int line = errortok.beginLine, column = errortok.beginColumn;
-    String mess = (errortok.kind == 0) ? tokenImage[0] : errortok.image;
-    return new ParseException("Parse error at line " + line + ", column " + column + ".  Encountered: " + mess);
-  }
-
-  final public void enable_tracing() {
-  }
-
-  final public void disable_tracing() {
-  }
-
-}
diff --git a/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/SelectorParserConstants.java b/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/SelectorParserConstants.java
deleted file mode 100644
index 40c4577..0000000
--- a/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/SelectorParserConstants.java
+++ /dev/null
@@ -1,95 +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.
- */
-/* Generated By:JavaCC: Do not edit this line. SelectorParserConstants.java */
-package org.activemq.selector;
-
-public interface SelectorParserConstants {
-
-  int EOF = 0;
-  int LINE_COMMENT = 6;
-  int BLOCK_COMMENT = 7;
-  int NOT = 8;
-  int AND = 9;
-  int OR = 10;
-  int BETWEEN = 11;
-  int LIKE = 12;
-  int ESCAPE = 13;
-  int IN = 14;
-  int IS = 15;
-  int TRUE = 16;
-  int FALSE = 17;
-  int NULL = 18;
-  int XPATH = 19;
-  int XQUERY = 20;
-  int DECIMAL_LITERAL = 21;
-  int HEX_LITERAL = 22;
-  int OCTAL_LITERAL = 23;
-  int FLOATING_POINT_LITERAL = 24;
-  int EXPONENT = 25;
-  int STRING_LITERAL = 26;
-  int ID = 27;
-
-  int DEFAULT = 0;
-
-  String[] tokenImage = {
-    "<EOF>",
-    "\" \"",
-    "\"\\t\"",
-    "\"\\n\"",
-    "\"\\r\"",
-    "\"\\f\"",
-    "<LINE_COMMENT>",
-    "<BLOCK_COMMENT>",
-    "\"NOT\"",
-    "\"AND\"",
-    "\"OR\"",
-    "\"BETWEEN\"",
-    "\"LIKE\"",
-    "\"ESCAPE\"",
-    "\"IN\"",
-    "\"IS\"",
-    "\"TRUE\"",
-    "\"FALSE\"",
-    "\"NULL\"",
-    "\"XPATH\"",
-    "\"XQUERY\"",
-    "<DECIMAL_LITERAL>",
-    "<HEX_LITERAL>",
-    "<OCTAL_LITERAL>",
-    "<FLOATING_POINT_LITERAL>",
-    "<EXPONENT>",
-    "<STRING_LITERAL>",
-    "<ID>",
-    "\"=\"",
-    "\"<>\"",
-    "\">\"",
-    "\">=\"",
-    "\"<\"",
-    "\"<=\"",
-    "\"(\"",
-    "\",\"",
-    "\")\"",
-    "\"+\"",
-    "\"-\"",
-    "\"*\"",
-    "\"/\"",
-    "\"%\"",
-  };
-
-}
diff --git a/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/SelectorParserTokenManager.java b/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/SelectorParserTokenManager.java
deleted file mode 100644
index 279d1f3..0000000
--- a/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/SelectorParserTokenManager.java
+++ /dev/null
@@ -1,1061 +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.
- */
-/* Generated By:JavaCC: Do not edit this line. SelectorParserTokenManager.java */
-package org.activemq.selector;
-import java.io.*;
-import java.util.*;
-import javax.jms.InvalidSelectorException;
-import org.activemq.filter.*;
-
-public class SelectorParserTokenManager implements SelectorParserConstants
-{
-  public  java.io.PrintStream debugStream = System.out;
-  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private final int jjStopAtPos(int pos, int kind)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   return pos + 1;
-}
-private final int jjMoveStringLiteralDfa0_0()
-{
-   switch(curChar)
-   {
-      case 9:
-         jjmatchedKind = 2;
-         return jjMoveNfa_0(5, 0);
-      case 10:
-         jjmatchedKind = 3;
-         return jjMoveNfa_0(5, 0);
-      case 12:
-         jjmatchedKind = 5;
-         return jjMoveNfa_0(5, 0);
-      case 13:
-         jjmatchedKind = 4;
-         return jjMoveNfa_0(5, 0);
-      case 32:
-         jjmatchedKind = 1;
-         return jjMoveNfa_0(5, 0);
-      case 37:
-         jjmatchedKind = 41;
-         return jjMoveNfa_0(5, 0);
-      case 40:
-         jjmatchedKind = 34;
-         return jjMoveNfa_0(5, 0);
-      case 41:
-         jjmatchedKind = 36;
-         return jjMoveNfa_0(5, 0);
-      case 42:
-         jjmatchedKind = 39;
-         return jjMoveNfa_0(5, 0);
-      case 43:
-         jjmatchedKind = 37;
-         return jjMoveNfa_0(5, 0);
-      case 44:
-         jjmatchedKind = 35;
-         return jjMoveNfa_0(5, 0);
-      case 45:
-         jjmatchedKind = 38;
-         return jjMoveNfa_0(5, 0);
-      case 47:
-         jjmatchedKind = 40;
-         return jjMoveNfa_0(5, 0);
-      case 60:
-         jjmatchedKind = 32;
-         return jjMoveStringLiteralDfa1_0(0x220000000L);
-      case 61:
-         jjmatchedKind = 28;
-         return jjMoveNfa_0(5, 0);
-      case 62:
-         jjmatchedKind = 30;
-         return jjMoveStringLiteralDfa1_0(0x80000000L);
-      case 65:
-         return jjMoveStringLiteralDfa1_0(0x200L);
-      case 66:
-         return jjMoveStringLiteralDfa1_0(0x800L);
-      case 69:
-         return jjMoveStringLiteralDfa1_0(0x2000L);
-      case 70:
-         return jjMoveStringLiteralDfa1_0(0x20000L);
-      case 73:
-         return jjMoveStringLiteralDfa1_0(0xc000L);
-      case 76:
-         return jjMoveStringLiteralDfa1_0(0x1000L);
-      case 78:
-         return jjMoveStringLiteralDfa1_0(0x40100L);
-      case 79:
-         return jjMoveStringLiteralDfa1_0(0x400L);
-      case 84:
-         return jjMoveStringLiteralDfa1_0(0x10000L);
-      case 88:
-         return jjMoveStringLiteralDfa1_0(0x180000L);
-      case 97:
-         return jjMoveStringLiteralDfa1_0(0x200L);
-      case 98:
-         return jjMoveStringLiteralDfa1_0(0x800L);
-      case 101:
-         return jjMoveStringLiteralDfa1_0(0x2000L);
-      case 102:
-         return jjMoveStringLiteralDfa1_0(0x20000L);
-      case 105:
-         return jjMoveStringLiteralDfa1_0(0xc000L);
-      case 108:
-         return jjMoveStringLiteralDfa1_0(0x1000L);
-      case 110:
-         return jjMoveStringLiteralDfa1_0(0x40100L);
-      case 111:
-         return jjMoveStringLiteralDfa1_0(0x400L);
-      case 116:
-         return jjMoveStringLiteralDfa1_0(0x10000L);
-      case 120:
-         return jjMoveStringLiteralDfa1_0(0x180000L);
-      default :
-         return jjMoveNfa_0(5, 0);
-   }
-}
-private final int jjMoveStringLiteralDfa1_0(long active0)
-{
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 0);
-   }
-   switch(curChar)
-   {
-      case 61:
-         if ((active0 & 0x80000000L) != 0L)
-         {
-            jjmatchedKind = 31;
-            jjmatchedPos = 1;
-         }
-         else if ((active0 & 0x200000000L) != 0L)
-         {
-            jjmatchedKind = 33;
-            jjmatchedPos = 1;
-         }
-         break;
-      case 62:
-         if ((active0 & 0x20000000L) != 0L)
-         {
-            jjmatchedKind = 29;
-            jjmatchedPos = 1;
-         }
-         break;
-      case 65:
-         return jjMoveStringLiteralDfa2_0(active0, 0x20000L);
-      case 69:
-         return jjMoveStringLiteralDfa2_0(active0, 0x800L);
-      case 73:
-         return jjMoveStringLiteralDfa2_0(active0, 0x1000L);
-      case 78:
-         if ((active0 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 14;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x200L);
-      case 79:
-         return jjMoveStringLiteralDfa2_0(active0, 0x100L);
-      case 80:
-         return jjMoveStringLiteralDfa2_0(active0, 0x80000L);
-      case 81:
-         return jjMoveStringLiteralDfa2_0(active0, 0x100000L);
-      case 82:
-         if ((active0 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 10;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x10000L);
-      case 83:
-         if ((active0 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 15;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x2000L);
-      case 85:
-         return jjMoveStringLiteralDfa2_0(active0, 0x40000L);
-      case 97:
-         return jjMoveStringLiteralDfa2_0(active0, 0x20000L);
-      case 101:
-         return jjMoveStringLiteralDfa2_0(active0, 0x800L);
-      case 105:
-         return jjMoveStringLiteralDfa2_0(active0, 0x1000L);
-      case 110:
-         if ((active0 & 0x4000L) != 0L)
-         {
-            jjmatchedKind = 14;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x200L);
-      case 111:
-         return jjMoveStringLiteralDfa2_0(active0, 0x100L);
-      case 112:
-         return jjMoveStringLiteralDfa2_0(active0, 0x80000L);
-      case 113:
-         return jjMoveStringLiteralDfa2_0(active0, 0x100000L);
-      case 114:
-         if ((active0 & 0x400L) != 0L)
-         {
-            jjmatchedKind = 10;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x10000L);
-      case 115:
-         if ((active0 & 0x8000L) != 0L)
-         {
-            jjmatchedKind = 15;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x2000L);
-      case 117:
-         return jjMoveStringLiteralDfa2_0(active0, 0x40000L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 1);
-}
-private final int jjMoveStringLiteralDfa2_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjMoveNfa_0(5, 1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 1);
-   }
-   switch(curChar)
-   {
-      case 65:
-         return jjMoveStringLiteralDfa3_0(active0, 0x80000L);
-      case 67:
-         return jjMoveStringLiteralDfa3_0(active0, 0x2000L);
-      case 68:
-         if ((active0 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 9;
-            jjmatchedPos = 2;
-         }
-         break;
-      case 75:
-         return jjMoveStringLiteralDfa3_0(active0, 0x1000L);
-      case 76:
-         return jjMoveStringLiteralDfa3_0(active0, 0x60000L);
-      case 84:
-         if ((active0 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 8;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x800L);
-      case 85:
-         return jjMoveStringLiteralDfa3_0(active0, 0x110000L);
-      case 97:
-         return jjMoveStringLiteralDfa3_0(active0, 0x80000L);
-      case 99:
-         return jjMoveStringLiteralDfa3_0(active0, 0x2000L);
-      case 100:
-         if ((active0 & 0x200L) != 0L)
-         {
-            jjmatchedKind = 9;
-            jjmatchedPos = 2;
-         }
-         break;
-      case 107:
-         return jjMoveStringLiteralDfa3_0(active0, 0x1000L);
-      case 108:
-         return jjMoveStringLiteralDfa3_0(active0, 0x60000L);
-      case 116:
-         if ((active0 & 0x100L) != 0L)
-         {
-            jjmatchedKind = 8;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0x800L);
-      case 117:
-         return jjMoveStringLiteralDfa3_0(active0, 0x110000L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 2);
-}
-private final int jjMoveStringLiteralDfa3_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjMoveNfa_0(5, 2);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 2);
-   }
-   switch(curChar)
-   {
-      case 65:
-         return jjMoveStringLiteralDfa4_0(active0, 0x2000L);
-      case 69:
-         if ((active0 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 12;
-            jjmatchedPos = 3;
-         }
-         else if ((active0 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 16;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x100000L);
-      case 76:
-         if ((active0 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 18;
-            jjmatchedPos = 3;
-         }
-         break;
-      case 83:
-         return jjMoveStringLiteralDfa4_0(active0, 0x20000L);
-      case 84:
-         return jjMoveStringLiteralDfa4_0(active0, 0x80000L);
-      case 87:
-         return jjMoveStringLiteralDfa4_0(active0, 0x800L);
-      case 97:
-         return jjMoveStringLiteralDfa4_0(active0, 0x2000L);
-      case 101:
-         if ((active0 & 0x1000L) != 0L)
-         {
-            jjmatchedKind = 12;
-            jjmatchedPos = 3;
-         }
-         else if ((active0 & 0x10000L) != 0L)
-         {
-            jjmatchedKind = 16;
-            jjmatchedPos = 3;
-         }
-         return jjMoveStringLiteralDfa4_0(active0, 0x100000L);
-      case 108:
-         if ((active0 & 0x40000L) != 0L)
-         {
-            jjmatchedKind = 18;
-            jjmatchedPos = 3;
-         }
-         break;
-      case 115:
-         return jjMoveStringLiteralDfa4_0(active0, 0x20000L);
-      case 116:
-         return jjMoveStringLiteralDfa4_0(active0, 0x80000L);
-      case 119:
-         return jjMoveStringLiteralDfa4_0(active0, 0x800L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 3);
-}
-private final int jjMoveStringLiteralDfa4_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjMoveNfa_0(5, 3);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 3);
-   }
-   switch(curChar)
-   {
-      case 69:
-         if ((active0 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 17;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x800L);
-      case 72:
-         if ((active0 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 19;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 80:
-         return jjMoveStringLiteralDfa5_0(active0, 0x2000L);
-      case 82:
-         return jjMoveStringLiteralDfa5_0(active0, 0x100000L);
-      case 101:
-         if ((active0 & 0x20000L) != 0L)
-         {
-            jjmatchedKind = 17;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x800L);
-      case 104:
-         if ((active0 & 0x80000L) != 0L)
-         {
-            jjmatchedKind = 19;
-            jjmatchedPos = 4;
-         }
-         break;
-      case 112:
-         return jjMoveStringLiteralDfa5_0(active0, 0x2000L);
-      case 114:
-         return jjMoveStringLiteralDfa5_0(active0, 0x100000L);
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 4);
-}
-private final int jjMoveStringLiteralDfa5_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjMoveNfa_0(5, 4);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 4);
-   }
-   switch(curChar)
-   {
-      case 69:
-         if ((active0 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 13;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x800L);
-      case 89:
-         if ((active0 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 20;
-            jjmatchedPos = 5;
-         }
-         break;
-      case 101:
-         if ((active0 & 0x2000L) != 0L)
-         {
-            jjmatchedKind = 13;
-            jjmatchedPos = 5;
-         }
-         return jjMoveStringLiteralDfa6_0(active0, 0x800L);
-      case 121:
-         if ((active0 & 0x100000L) != 0L)
-         {
-            jjmatchedKind = 20;
-            jjmatchedPos = 5;
-         }
-         break;
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 5);
-}
-private final int jjMoveStringLiteralDfa6_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjMoveNfa_0(5, 5);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-   return jjMoveNfa_0(5, 5);
-   }
-   switch(curChar)
-   {
-      case 78:
-         if ((active0 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 11;
-            jjmatchedPos = 6;
-         }
-         break;
-      case 110:
-         if ((active0 & 0x800L) != 0L)
-         {
-            jjmatchedKind = 11;
-            jjmatchedPos = 6;
-         }
-         break;
-      default :
-         break;
-   }
-   return jjMoveNfa_0(5, 6);
-}
-private final void jjCheckNAdd(int state)
-{
-   if (jjrounds[state] != jjround)
-   {
-      jjstateSet[jjnewStateCnt++] = state;
-      jjrounds[state] = jjround;
-   }
-}
-private final void jjAddStates(int start, int end)
-{
-   do {
-      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
-   } while (start++ != end);
-}
-private final void jjCheckNAddTwoStates(int state1, int state2)
-{
-   jjCheckNAdd(state1);
-   jjCheckNAdd(state2);
-}
-private final void jjCheckNAddStates(int start, int end)
-{
-   do {
-      jjCheckNAdd(jjnextStates[start]);
-   } while (start++ != end);
-}
-private final void jjCheckNAddStates(int start)
-{
-   jjCheckNAdd(jjnextStates[start]);
-   jjCheckNAdd(jjnextStates[start + 1]);
-}
-static final long[] jjbitVec0 = {
-   0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-static final long[] jjbitVec2 = {
-   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-private final int jjMoveNfa_0(int startState, int curPos)
-{
-   int strKind = jjmatchedKind;
-   int strPos = jjmatchedPos;
-   int seenUpto;
-   input_stream.backup(seenUpto = curPos + 1);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) { throw new Error("Internal Error"); }
-   curPos = 0;
-   int[] nextStates;
-   int startsAt = 0;
-   jjnewStateCnt = 43;
-   int i = 1;
-   jjstateSet[0] = startState;
-   int j, kind = 0x7fffffff;
-   for (;;)
-   {
-      if (++jjround == 0x7fffffff)
-         ReInitRounds();
-      if (curChar < 64)
-      {
-         long l = 1L << curChar;
-         MatchLoop: do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 5:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(0, 3);
-                  else if (curChar == 36)
-                  {
-                     if (kind > 27)
-                        kind = 27;
-                     jjCheckNAdd(27);
-                  }
-                  else if (curChar == 39)
-                     jjCheckNAddStates(4, 6);
-                  else if (curChar == 46)
-                     jjCheckNAdd(17);
-                  else if (curChar == 47)
-                     jjstateSet[jjnewStateCnt++] = 6;
-                  else if (curChar == 45)
-                     jjstateSet[jjnewStateCnt++] = 0;
-                  if ((0x3fe000000000000L & l) != 0L)
-                  {
-                     if (kind > 21)
-                        kind = 21;
-                     jjCheckNAddTwoStates(14, 15);
-                  }
-                  else if (curChar == 48)
-                  {
-                     if (kind > 23)
-                        kind = 23;
-                     jjCheckNAddTwoStates(40, 42);
-                  }
-                  break;
-               case 0:
-                  if (curChar == 45)
-                     jjCheckNAddStates(7, 9);
-                  break;
-               case 1:
-                  if ((0xffffffffffffdbffL & l) != 0L)
-                     jjCheckNAddStates(7, 9);
-                  break;
-               case 2:
-                  if ((0x2400L & l) != 0L && kind > 6)
-                     kind = 6;
-                  break;
-               case 3:
-                  if (curChar == 10 && kind > 6)
-                     kind = 6;
-                  break;
-               case 4:
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 3;
-                  break;
-               case 6:
-                  if (curChar == 42)
-                     jjCheckNAddTwoStates(7, 8);
-                  break;
-               case 7:
-                  if ((0xfffffbffffffffffL & l) != 0L)
-                     jjCheckNAddTwoStates(7, 8);
-                  break;
-               case 8:
-                  if (curChar == 42)
-                     jjCheckNAddStates(10, 12);
-                  break;
-               case 9:
-                  if ((0xffff7bffffffffffL & l) != 0L)
-                     jjCheckNAddTwoStates(10, 8);
-                  break;
-               case 10:
-                  if ((0xfffffbffffffffffL & l) != 0L)
-                     jjCheckNAddTwoStates(10, 8);
-                  break;
-               case 11:
-                  if (curChar == 47 && kind > 7)
-                     kind = 7;
-                  break;
-               case 12:
-                  if (curChar == 47)
-                     jjstateSet[jjnewStateCnt++] = 6;
-                  break;
-               case 13:
-                  if ((0x3fe000000000000L & l) == 0L)
-                     break;
-                  if (kind > 21)
-                     kind = 21;
-                  jjCheckNAddTwoStates(14, 15);
-                  break;
-               case 14:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 21)
-                     kind = 21;
-                  jjCheckNAddTwoStates(14, 15);
-                  break;
-               case 16:
-                  if (curChar == 46)
-                     jjCheckNAdd(17);
-                  break;
-               case 17:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 24)
-                     kind = 24;
-                  jjCheckNAddTwoStates(17, 18);
-                  break;
-               case 19:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(20);
-                  break;
-               case 20:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 24)
-                     kind = 24;
-                  jjCheckNAdd(20);
-                  break;
-               case 21:
-               case 22:
-                  if (curChar == 39)
-                     jjCheckNAddStates(4, 6);
-                  break;
-               case 23:
-                  if (curChar == 39)
-                     jjstateSet[jjnewStateCnt++] = 22;
-                  break;
-               case 24:
-                  if ((0xffffff7fffffffffL & l) != 0L)
-                     jjCheckNAddStates(4, 6);
-                  break;
-               case 25:
-                  if (curChar == 39 && kind > 26)
-                     kind = 26;
-                  break;
-               case 26:
-                  if (curChar != 36)
-                     break;
-                  if (kind > 27)
-                     kind = 27;
-                  jjCheckNAdd(27);
-                  break;
-               case 27:
-                  if ((0x3ff001000000000L & l) == 0L)
-                     break;
-                  if (kind > 27)
-                     kind = 27;
-                  jjCheckNAdd(27);
-                  break;
-               case 28:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(0, 3);
-                  break;
-               case 29:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(29, 30);
-                  break;
-               case 30:
-                  if (curChar != 46)
-                     break;
-                  if (kind > 24)
-                     kind = 24;
-                  jjCheckNAddTwoStates(31, 32);
-                  break;
-               case 31:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 24)
-                     kind = 24;
-                  jjCheckNAddTwoStates(31, 32);
-                  break;
-               case 33:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(34);
-                  break;
-               case 34:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 24)
-                     kind = 24;
-                  jjCheckNAdd(34);
-                  break;
-               case 35:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(35, 36);
-                  break;
-               case 37:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(38);
-                  break;
-               case 38:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 24)
-                     kind = 24;
-                  jjCheckNAdd(38);
-                  break;
-               case 39:
-                  if (curChar != 48)
-                     break;
-                  if (kind > 23)
-                     kind = 23;
-                  jjCheckNAddTwoStates(40, 42);
-                  break;
-               case 41:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 22)
-                     kind = 22;
-                  jjstateSet[jjnewStateCnt++] = 41;
-                  break;
-               case 42:
-                  if ((0xff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 23)
-                     kind = 23;
-                  jjCheckNAdd(42);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         MatchLoop: do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 5:
-               case 27:
-                  if ((0x7fffffe87fffffeL & l) == 0L)
-                     break;
-                  if (kind > 27)
-                     kind = 27;
-                  jjCheckNAdd(27);
-                  break;
-               case 1:
-                  jjAddStates(7, 9);
-                  break;
-               case 7:
-                  jjCheckNAddTwoStates(7, 8);
-                  break;
-               case 9:
-               case 10:
-                  jjCheckNAddTwoStates(10, 8);
-                  break;
-               case 15:
-                  if ((0x100000001000L & l) != 0L && kind > 21)
-                     kind = 21;
-                  break;
-               case 18:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(13, 14);
-                  break;
-               case 24:
-                  jjAddStates(4, 6);
-                  break;
-               case 32:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(15, 16);
-                  break;
-               case 36:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(17, 18);
-                  break;
-               case 40:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjCheckNAdd(41);
-                  break;
-               case 41:
-                  if ((0x7e0000007eL & l) == 0L)
-                     break;
-                  if (kind > 22)
-                     kind = 22;
-                  jjCheckNAdd(41);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int hiByte = (int)(curChar >> 8);
-         int i1 = hiByte >> 6;
-         long l1 = 1L << (hiByte & 077);
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         MatchLoop: do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 1:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjAddStates(7, 9);
-                  break;
-               case 7:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjCheckNAddTwoStates(7, 8);
-                  break;
-               case 9:
-               case 10:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjCheckNAddTwoStates(10, 8);
-                  break;
-               case 24:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjAddStates(4, 6);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 43 - (jjnewStateCnt = startsAt)))
-         break;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { break; }
-   }
-   if (jjmatchedPos > strPos)
-      return curPos;
-
-   int toRet = Math.max(curPos, seenUpto);
-
-   if (curPos < toRet)
-      for (i = toRet - Math.min(curPos, seenUpto); i-- > 0; )
-         try { curChar = input_stream.readChar(); }
-         catch(java.io.IOException e) { throw new Error("Internal Error : Please send a bug report."); }
-
-   if (jjmatchedPos < strPos)
-   {
-      jjmatchedKind = strKind;
-      jjmatchedPos = strPos;
-   }
-   else if (jjmatchedPos == strPos && jjmatchedKind > strKind)
-      jjmatchedKind = strKind;
-
-   return toRet;
-}
-static final int[] jjnextStates = {
-   29, 30, 35, 36, 23, 24, 25, 1, 2, 4, 8, 9, 11, 19, 20, 33, 
-   34, 37, 38, 
-};
-private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
-{
-   switch(hiByte)
-   {
-      case 0:
-         return ((jjbitVec2[i2] & l2) != 0L);
-      default : 
-         if ((jjbitVec0[i1] & l1) != 0L)
-            return true;
-         return false;
-   }
-}
-public static final String[] jjstrLiteralImages = {
-"", null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, "\75", "\74\76", "\76", "\76\75", "\74", "\74\75", "\50", "\54", "\51", "\53", 
-"\55", "\52", "\57", "\45", };
-public static final String[] lexStateNames = {
-   "DEFAULT", 
-};
-static final long[] jjtoToken = {
-   0x3fffdffff01L, 
-};
-static final long[] jjtoSkip = {
-   0xfeL, 
-};
-static final long[] jjtoSpecial = {
-   0x3eL, 
-};
-protected SimpleCharStream input_stream;
-private final int[] jjrounds = new int[43];
-private final int[] jjstateSet = new int[86];
-protected char curChar;
-public SelectorParserTokenManager(SimpleCharStream stream)
-{
-   if (SimpleCharStream.staticFlag)
-      throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
-   input_stream = stream;
-}
-public SelectorParserTokenManager(SimpleCharStream stream, int lexState)
-{
-   this(stream);
-   SwitchTo(lexState);
-}
-public void ReInit(SimpleCharStream stream)
-{
-   jjmatchedPos = jjnewStateCnt = 0;
-   curLexState = defaultLexState;
-   input_stream = stream;
-   ReInitRounds();
-}
-private final void ReInitRounds()
-{
-   int i;
-   jjround = 0x80000001;
-   for (i = 43; i-- > 0;)
-      jjrounds[i] = 0x80000000;
-}
-public void ReInit(SimpleCharStream stream, int lexState)
-{
-   ReInit(stream);
-   SwitchTo(lexState);
-}
-public void SwitchTo(int lexState)
-{
-   if (lexState >= 1 || lexState < 0)
-      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
-   else
-      curLexState = lexState;
-}
-
-protected Token jjFillToken()
-{
-   Token t = Token.newToken(jjmatchedKind);
-   t.kind = jjmatchedKind;
-   String im = jjstrLiteralImages[jjmatchedKind];
-   t.image = (im == null) ? input_stream.GetImage() : im;
-   t.beginLine = input_stream.getBeginLine();
-   t.beginColumn = input_stream.getBeginColumn();
-   t.endLine = input_stream.getEndLine();
-   t.endColumn = input_stream.getEndColumn();
-   return t;
-}
-
-int curLexState = 0;
-int defaultLexState = 0;
-int jjnewStateCnt;
-int jjround;
-int jjmatchedPos;
-int jjmatchedKind;
-
-public Token getNextToken() 
-{
-  int kind;
-  Token specialToken = null;
-  Token matchedToken;
-  int curPos = 0;
-
-  EOFLoop :
-  for (;;)
-  {   
-   try   
-   {     
-      curChar = input_stream.BeginToken();
-   }     
-   catch(java.io.IOException e)
-   {        
-      jjmatchedKind = 0;
-      matchedToken = jjFillToken();
-      matchedToken.specialToken = specialToken;
-      return matchedToken;
-   }
-
-   jjmatchedKind = 0x7fffffff;
-   jjmatchedPos = 0;
-   curPos = jjMoveStringLiteralDfa0_0();
-   if (jjmatchedKind != 0x7fffffff)
-   {
-      if (jjmatchedPos + 1 < curPos)
-         input_stream.backup(curPos - jjmatchedPos - 1);
-      if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-      {
-         matchedToken = jjFillToken();
-         matchedToken.specialToken = specialToken;
-         return matchedToken;
-      }
-      else
-      {
-         if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-         {
-            matchedToken = jjFillToken();
-            if (specialToken == null)
-               specialToken = matchedToken;
-            else
-            {
-               matchedToken.specialToken = specialToken;
-               specialToken = (specialToken.next = matchedToken);
-            }
-         }
-         continue EOFLoop;
-      }
-   }
-   int error_line = input_stream.getEndLine();
-   int error_column = input_stream.getEndColumn();
-   String error_after = null;
-   boolean EOFSeen = false;
-   try { input_stream.readChar(); input_stream.backup(1); }
-   catch (java.io.IOException e1) {
-      EOFSeen = true;
-      error_after = curPos <= 1 ? "" : input_stream.GetImage();
-      if (curChar == '\n' || curChar == '\r') {
-         error_line++;
-         error_column = 0;
-      }
-      else
-         error_column++;
-   }
-   if (!EOFSeen) {
-      input_stream.backup(1);
-      error_after = curPos <= 1 ? "" : input_stream.GetImage();
-   }
-   throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
-  }
-}
-
-}
diff --git a/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/SimpleCharStream.java b/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/SimpleCharStream.java
deleted file mode 100644
index 40d6a8e..0000000
--- a/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/SimpleCharStream.java
+++ /dev/null
@@ -1,419 +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.
- */
-/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 3.0 */
-package org.activemq.selector;
-
-/**
- * An implementation of interface CharStream, where the stream is assumed to
- * contain only ASCII characters (without unicode processing).
- */
-
-public class SimpleCharStream
-{
-  public static final boolean staticFlag = false;
-  int bufsize;
-  int available;
-  int tokenBegin;
-  public int bufpos = -1;
-  protected int bufline[];
-  protected int bufcolumn[];
-
-  protected int column = 0;
-  protected int line = 1;
-
-  protected boolean prevCharIsCR = false;
-  protected boolean prevCharIsLF = false;
-
-  protected java.io.Reader inputStream;
-
-  protected char[] buffer;
-  protected int maxNextCharInd = 0;
-  protected int inBuf = 0;
-
-  protected void ExpandBuff(boolean wrapAround)
-  {
-     char[] newbuffer = new char[bufsize + 2048];
-     int newbufline[] = new int[bufsize + 2048];
-     int newbufcolumn[] = new int[bufsize + 2048];
-
-     try
-     {
-        if (wrapAround)
-        {
-           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-           System.arraycopy(buffer, 0, newbuffer,
-                                             bufsize - tokenBegin, bufpos);
-           buffer = newbuffer;
-
-           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-           System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
-           bufline = newbufline;
-
-           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-           System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
-           bufcolumn = newbufcolumn;
-
-           maxNextCharInd = (bufpos += (bufsize - tokenBegin));
-        }
-        else
-        {
-           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-           buffer = newbuffer;
-
-           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-           bufline = newbufline;
-
-           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-           bufcolumn = newbufcolumn;
-
-           maxNextCharInd = (bufpos -= tokenBegin);
-        }
-     }
-     catch (Throwable t)
-     {
-        throw new Error(t.getMessage());
-     }
-
-
-     bufsize += 2048;
-     available = bufsize;
-     tokenBegin = 0;
-  }
-
-  protected void FillBuff() throws java.io.IOException
-  {
-     if (maxNextCharInd == available)
-     {
-        if (available == bufsize)
-        {
-           if (tokenBegin > 2048)
-           {
-              bufpos = maxNextCharInd = 0;
-              available = tokenBegin;
-           }
-           else if (tokenBegin < 0)
-              bufpos = maxNextCharInd = 0;
-           else
-              ExpandBuff(false);
-        }
-        else if (available > tokenBegin)
-           available = bufsize;
-        else if ((tokenBegin - available) < 2048)
-           ExpandBuff(true);
-        else
-           available = tokenBegin;
-     }
-
-     int i;
-     try {
-        if ((i = inputStream.read(buffer, maxNextCharInd,
-                                    available - maxNextCharInd)) == -1)
-        {
-           inputStream.close();
-           throw new java.io.IOException();
-        }
-        else
-           maxNextCharInd += i;
-        return;
-     }
-     catch(java.io.IOException e) {
-        --bufpos;
-        backup(0);
-        if (tokenBegin == -1)
-           tokenBegin = bufpos;
-        throw e;
-     }
-  }
-
-  public char BeginToken() throws java.io.IOException
-  {
-     tokenBegin = -1;
-     char c = readChar();
-     tokenBegin = bufpos;
-
-     return c;
-  }
-
-  protected void UpdateLineColumn(char c)
-  {
-     column++;
-
-     if (prevCharIsLF)
-     {
-        prevCharIsLF = false;
-        line += (column = 1);
-     }
-     else if (prevCharIsCR)
-     {
-        prevCharIsCR = false;
-        if (c == '\n')
-        {
-           prevCharIsLF = true;
-        }
-        else
-           line += (column = 1);
-     }
-
-     switch (c)
-     {
-        case '\r' :
-           prevCharIsCR = true;
-           break;
-        case '\n' :
-           prevCharIsLF = true;
-           break;
-        case '\t' :
-           column--;
-           column += (8 - (column & 07));
-           break;
-        default :
-           break;
-     }
-
-     bufline[bufpos] = line;
-     bufcolumn[bufpos] = column;
-  }
-
-  public char readChar() throws java.io.IOException
-  {
-     if (inBuf > 0)
-     {
-        --inBuf;
-
-        if (++bufpos == bufsize)
-           bufpos = 0;
-
-        return buffer[bufpos];
-     }
-
-     if (++bufpos >= maxNextCharInd)
-        FillBuff();
-
-     char c = buffer[bufpos];
-
-     UpdateLineColumn(c);
-     return (c);
-  }
-
-  /**
-   * @deprecated 
-   * @see #getEndColumn
-   */
-
-  public int getColumn() {
-     return bufcolumn[bufpos];
-  }
-
-  /**
-   * @deprecated 
-   * @see #getEndLine
-   */
-
-  public int getLine() {
-     return bufline[bufpos];
-  }
-
-  public int getEndColumn() {
-     return bufcolumn[bufpos];
-  }
-
-  public int getEndLine() {
-     return bufline[bufpos];
-  }
-
-  public int getBeginColumn() {
-     return bufcolumn[tokenBegin];
-  }
-
-  public int getBeginLine() {
-     return bufline[tokenBegin];
-  }
-
-  public void backup(int amount) {
-
-    inBuf += amount;
-    if ((bufpos -= amount) < 0)
-       bufpos += bufsize;
-  }
-
-  public SimpleCharStream(java.io.Reader dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    available = bufsize = buffersize;
-    buffer = new char[buffersize];
-    bufline = new int[buffersize];
-    bufcolumn = new int[buffersize];
-  }
-
-  public SimpleCharStream(java.io.Reader dstream, int startline,
-                                                           int startcolumn)
-  {
-     this(dstream, startline, startcolumn, 4096);
-  }
-
-  public SimpleCharStream(java.io.Reader dstream)
-  {
-     this(dstream, 1, 1, 4096);
-  }
-  public void ReInit(java.io.Reader dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    if (buffer == null || buffersize != buffer.length)
-    {
-      available = bufsize = buffersize;
-      buffer = new char[buffersize];
-      bufline = new int[buffersize];
-      bufcolumn = new int[buffersize];
-    }
-    prevCharIsLF = prevCharIsCR = false;
-    tokenBegin = inBuf = maxNextCharInd = 0;
-    bufpos = -1;
-  }
-
-  public void ReInit(java.io.Reader dstream, int startline,
-                                                           int startcolumn)
-  {
-     ReInit(dstream, startline, startcolumn, 4096);
-  }
-
-  public void ReInit(java.io.Reader dstream)
-  {
-     ReInit(dstream, 1, 1, 4096);
-  }
-  public SimpleCharStream(java.io.InputStream dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-     this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
-  }
-
-  public SimpleCharStream(java.io.InputStream dstream, int startline,
-                                                           int startcolumn)
-  {
-     this(dstream, startline, startcolumn, 4096);
-  }
-
-  public SimpleCharStream(java.io.InputStream dstream)
-  {
-     this(dstream, 1, 1, 4096);
-  }
-
-  public void ReInit(java.io.InputStream dstream, int startline,
-                          int startcolumn, int buffersize)
-  {
-     ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
-  }
-
-  public void ReInit(java.io.InputStream dstream)
-  {
-     ReInit(dstream, 1, 1, 4096);
-  }
-  public void ReInit(java.io.InputStream dstream, int startline,
-                                                           int startcolumn)
-  {
-     ReInit(dstream, startline, startcolumn, 4096);
-  }
-  public String GetImage()
-  {
-     if (bufpos >= tokenBegin)
-        return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
-     else
-        return new String(buffer, tokenBegin, bufsize - tokenBegin) +
-                              new String(buffer, 0, bufpos + 1);
-  }
-
-  public char[] GetSuffix(int len)
-  {
-     char[] ret = new char[len];
-
-     if ((bufpos + 1) >= len)
-        System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
-     else
-     {
-        System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
-                                                          len - bufpos - 1);
-        System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
-     }
-
-     return ret;
-  }
-
-  public void Done()
-  {
-     buffer = null;
-     bufline = null;
-     bufcolumn = null;
-  }
-
-  /**
-   * Method to adjust line and column numbers for the start of a token.
-   */
-  public void adjustBeginLineColumn(int newLine, int newCol)
-  {
-     int start = tokenBegin;
-     int len;
-
-     if (bufpos >= tokenBegin)
-     {
-        len = bufpos - tokenBegin + inBuf + 1;
-     }
-     else
-     {
-        len = bufsize - tokenBegin + bufpos + 1 + inBuf;
-     }
-
-     int i = 0, j = 0, k = 0;
-     int nextColDiff = 0, columnDiff = 0;
-
-     while (i < len &&
-            bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
-     {
-        bufline[j] = newLine;
-        nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
-        bufcolumn[j] = newCol + columnDiff;
-        columnDiff = nextColDiff;
-        i++;
-     } 
-
-     if (i < len)
-     {
-        bufline[j] = newLine++;
-        bufcolumn[j] = newCol + columnDiff;
-
-        while (i++ < len)
-        {
-           if (bufline[j = start % bufsize] != bufline[++start % bufsize])
-              bufline[j] = newLine++;
-           else
-              bufline[j] = newLine;
-        }
-     }
-
-     line = bufline[j];
-     column = bufcolumn[j];
-  }
-
-}
diff --git a/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/Token.java b/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/Token.java
deleted file mode 100644
index 7ad4efd..0000000
--- a/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/Token.java
+++ /dev/null
@@ -1,99 +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.
- */
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */
-package org.activemq.selector;
-
-/**
- * Describes the input token stream.
- */
-
-public class Token {
-
-  /**
-   * An integer that describes the kind of this token.  This numbering
-   * system is determined by JavaCCParser, and a table of these numbers is
-   * stored in the file ...Constants.java.
-   */
-  public int kind;
-
-  /**
-   * beginLine and beginColumn describe the position of the first character
-   * of this token; endLine and endColumn describe the position of the
-   * last character of this token.
-   */
-  public int beginLine, beginColumn, endLine, endColumn;
-
-  /**
-   * The string image of the token.
-   */
-  public String image;
-
-  /**
-   * A reference to the next regular (non-special) token from the input
-   * stream.  If this is the last token from the input stream, or if the
-   * token manager has not read tokens beyond this one, this field is
-   * set to null.  This is true only if this token is also a regular
-   * token.  Otherwise, see below for a description of the contents of
-   * this field.
-   */
-  public Token next;
-
-  /**
-   * This field is used to access special tokens that occur prior to this
-   * token, but after the immediately preceding regular (non-special) token.
-   * If there are no such special tokens, this field is set to null.
-   * When there are more than one such special token, this field refers
-   * to the last of these special tokens, which in turn refers to the next
-   * previous special token through its specialToken field, and so on
-   * until the first special token (whose specialToken field is null).
-   * The next fields of special tokens refer to other special tokens that
-   * immediately follow it (without an intervening regular token).  If there
-   * is no such token, this field is null.
-   */
-  public Token specialToken;
-
-  /**
-   * Returns the image.
-   */
-  public String toString()
-  {
-     return image;
-  }
-
-  /**
-   * Returns a new Token object, by default. However, if you want, you
-   * can create and return subclass objects based on the value of ofKind.
-   * Simply add the cases to the switch for all those special cases.
-   * For example, if you have a subclass of Token called IDToken that
-   * you want to create if ofKind is ID, simlpy add something like :
-   *
-   *    case MyParserConstants.ID : return new IDToken();
-   *
-   * to the following switch statement. Then you can cast matchedToken
-   * variable to the appropriate type and use it in your lexical actions.
-   */
-  public static final Token newToken(int ofKind)
-  {
-     switch(ofKind)
-     {
-       default : return new Token();
-     }
-  }
-
-}
diff --git a/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/TokenMgrError.java b/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/TokenMgrError.java
deleted file mode 100644
index f8b7455..0000000
--- a/maven2-plugins/myfaces-javacc-plugin/src/test/resources/validator/TokenMgrError.java
+++ /dev/null
@@ -1,151 +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.
- */
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 3.0 */
-package org.activemq.selector;
-
-public class TokenMgrError extends Error
-{
-   /*
-    * Ordinals for various reasons why an Error of this type can be thrown.
-    */
-
-   /**
-    * Lexical error occured.
-    */
-   static final int LEXICAL_ERROR = 0;
-
-   /**
-    * An attempt wass made to create a second instance of a static token manager.
-    */
-   static final int STATIC_LEXER_ERROR = 1;
-
-   /**
-    * Tried to change to an invalid lexical state.
-    */
-   static final int INVALID_LEXICAL_STATE = 2;
-
-   /**
-    * Detected (and bailed out of) an infinite loop in the token manager.
-    */
-   static final int LOOP_DETECTED = 3;
-
-   /**
-    * Indicates the reason why the exception is thrown. It will have
-    * one of the above 4 values.
-    */
-   int errorCode;
-
-   /**
-    * Replaces unprintable characters by their espaced (or unicode escaped)
-    * equivalents in the given string
-    */
-   protected static final String addEscapes(String str) {
-      StringBuffer retval = new StringBuffer();
-      char ch;
-      for (int i = 0; i < str.length(); i++) {
-        switch (str.charAt(i))
-        {
-           case 0 :
-              continue;
-           case '\b':
-              retval.append("\\b");
-              continue;
-           case '\t':
-              retval.append("\\t");
-              continue;
-           case '\n':
-              retval.append("\\n");
-              continue;
-           case '\f':
-              retval.append("\\f");
-              continue;
-           case '\r':
-              retval.append("\\r");
-              continue;
-           case '\"':
-              retval.append("\\\"");
-              continue;
-           case '\'':
-              retval.append("\\\'");
-              continue;
-           case '\\':
-              retval.append("\\\\");
-              continue;
-           default:
-              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-                 String s = "0000" + Integer.toString(ch, 16);
-                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-              } else {
-                 retval.append(ch);
-              }
-              continue;
-        }
-      }
-      return retval.toString();
-   }
-
-   /**
-    * Returns a detailed message for the Error when it is thrown by the
-    * token manager to indicate a lexical error.
-    * Parameters : 
-    *    EOFSeen     : indicates if EOF caused the lexicl error
-    *    curLexState : lexical state in which this error occured
-    *    errorLine   : line number when the error occured
-    *    errorColumn : column number when the error occured
-    *    errorAfter  : prefix that was seen before this error occured
-    *    curchar     : the offending character
-    * Note: You can customize the lexical error message by modifying this method.
-    */
-   protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
-      return("Lexical error at line " +
-           errorLine + ", column " +
-           errorColumn + ".  Encountered: " +
-           (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
-           "after : \"" + addEscapes(errorAfter) + "\"");
-   }
-
-   /**
-    * You can also modify the body of this method to customize your error messages.
-    * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
-    * of end-users concern, so you can return something like : 
-    *
-    *     "Internal Error : Please file a bug report .... "
-    *
-    * from this method for such cases in the release version of your parser.
-    */
-   public String getMessage() {
-      return super.getMessage();
-   }
-
-   /*
-    * Constructors of various flavors follow.
-    */
-
-   public TokenMgrError() {
-   }
-
-   public TokenMgrError(String message, int reason) {
-      super(message);
-      errorCode = reason;
-   }
-
-   public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
-      this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
-   }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/LICENSE.txt b/maven2-plugins/myfaces-javascript-plugin/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/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/maven2-plugins/myfaces-javascript-plugin/NOTICE.txt b/maven2-plugins/myfaces-javascript-plugin/NOTICE.txt
deleted file mode 100644
index fa3dbd6..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/NOTICE.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-=========================================================================
-==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
-==  Version 2.0, in this case for the Apache MyFaces Maven Plugins     ==
-=========================================================================
-
-This product includes software developed by 
-The Apache Software Foundation (http://www.apache.org/).
-
-Portions of this software were originally based on the following:
-
- - software copyright (c) 2000-2006, Oracle Corp, <http://www.oracle.com/>.
-and are licensed to the Apache Software Foundation under the 
-"Software Grant and Corporate Contribution License Agreement"
-
-See the LICENSE.txt file for information on all licenses 
-associated with this software.
diff --git a/maven2-plugins/myfaces-javascript-plugin/pom.xml b/maven2-plugins/myfaces-javascript-plugin/pom.xml
deleted file mode 100644
index c541e94..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/pom.xml
+++ /dev/null
@@ -1,115 +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.
-	   
--->
-<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>
-    <groupId>org.apache.myfaces.buildtools</groupId>
-    <artifactId>myfaces-plugin-parent</artifactId>
-    <version>1.0.2</version>
-  </parent>
-
-  <groupId>org.apache.myfaces.buildtools</groupId>
-  <artifactId>myfaces-javascript-plugin</artifactId>
-  <version>1.0.1-SNAPSHOT</version>
-  <packaging>maven-plugin</packaging>
-  <name>Apache MyFaces Buildtools Maven2 Javascript Plugin</name>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <inherited>true</inherited>
-        <configuration>
-          <source>1.5</source>
-          <target>1.5</target>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.myfaces.buildtools</groupId>
-        <artifactId>myfaces-javacc-plugin</artifactId>
-        <version>${project.version}</version>
-        <configuration>
-          <sourceDirectory>src/main/java</sourceDirectory>
-          <sourcePath>org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser</sourcePath>
-          <outputPath>org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser</outputPath>
-          <isStatic>false</isStatic>
-          <doNotGenerateTokenFile>true</doNotGenerateTokenFile>
-        </configuration>
-        <executions>
-          <execution>
-            <goals>
-              <goal>generate</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-          - Override checkstyle config file definitions from parent pom. The source of
-          - this project is not compliant with the normal MyFaces code style rules, and
-          - probably never will be.
-          -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-checkstyle-plugin</artifactId>
-        <version>2.2</version>
-        <configuration>
-          <configLocation>default/myfaces-checks-minimal.xml</configLocation>
-          <headerLocation>default/myfaces-header-spaces.txt</headerLocation>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-      <version>2.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId>
-      <version>2.0</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-      <version>1.0</version>
-    </dependency>
-  </dependencies>
-  
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-plugin-plugin</artifactId>
-        <version>2.2</version>
-      </plugin>
-    </plugins>
-  </reporting>
-
-
-</project>
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/ObfuscateJavascriptMojo.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/ObfuscateJavascriptMojo.java
deleted file mode 100644
index 46b0cd6..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/ObfuscateJavascriptMojo.java
+++ /dev/null
@@ -1,144 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript;
-
-//~--- non-JDK imports --------------------------------------------------------
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.Obfuscator;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.configuration.ConfigException;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.configuration.ObfuscatorConfig;
-
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-
-//~--- JDK imports ------------------------------------------------------------
-
-import java.io.File;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-//~--- classes ----------------------------------------------------------------
-
-/**
- * @version $Id$
- * @requiresDependencyResolution compile
- * @goal obfuscate-javascript
- * @phase generate-resources
- * @description Goal which obfuscates the Javascript sources
- */
-public class ObfuscateJavascriptMojo
-  extends AbstractMojo
-{
-
-  //~--- methods ------------------------------------------------------------
-
-  public void execute()
-    throws MojoExecutionException
-  {
-// List compileSourceRoots = new ArrayList();
-// compileSourceRoots.add(sourceDirectory);
-
-    try
-    {
-      _obfuscator = 
-          new Obfuscator(obfuscate, stripComments, stripWhitespaces, 
-                         stripNewlines, stripSpecialKeywords, 
-                         replaceCharLiterals, obfuscatorConfig);
-
-//      File outputDirectory = new File(targetDirectory, targetPath);
-
-      targetDirectory.mkdirs();
-
-      for (File sourceRoot: sourceDirectory)
-      {
-//        File sourceDirectory = new File(sourceRoot, sourcePath);
-        if (sourceRoot.exists())
-        {
-          _obfuscator.process(sourceRoot, targetDirectory);
-        }
-      }
-    }
-    catch (ConfigException e)
-    {
-      throw new MojoExecutionException("Invalid configuration parameters", 
-                                       e);
-    }
-  }
-  private Obfuscator _obfuscator;
-
-
-  /**
-   * @parameter
-   * @required
-   */
-  private boolean obfuscate = false;
-
-  /**
-   * @parameter
-   * @required
-   */
-  private boolean replaceCharLiterals = false;
-
-  /**
-   * @parameter
-   * @required
-   */
-  private boolean stripComments = false;
-
-  /**
-   * @parameter
-   * @required
-   */
-  private boolean stripNewlines = false;
-
-  /**
-   * @parameter
-   * @required
-   */
-  private boolean stripSpecialKeywords = false;
-
-  /**
-   * @parameter
-   * @required
-   */
-  private boolean stripWhitespaces = false;
-
-  /**
-   * @parameter 
-   * @required
-   */
-  private File[] sourceDirectory;
-
-
-  /**
-   * @parameter expression="${project.build.directory}/classes"
-   * @required
-   */
-  private File targetDirectory;
-
-  /**
-   * @parameter
-   * @required
-   */
-  private ObfuscatorConfig obfuscatorConfig;
-}
-
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/ReduceJavascriptMojo.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/ReduceJavascriptMojo.java
deleted file mode 100644
index 5f261d9..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/ReduceJavascriptMojo.java
+++ /dev/null
@@ -1,165 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.uixtools.Reducer;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.maven.model.Resource;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-
-/**
- * @version $Id$
- * @goal reduce-javascript
- * @phase generate-sources
- * @description Goal which compiles the Javascript sources
- */
-public class ReduceJavascriptMojo extends AbstractMojo
-{
-  public void execute() throws MojoExecutionException
-  {
-    List compileSourceRoots = new ArrayList();
-    compileSourceRoots.add(sourceDirectory);
-    // TODO: register these paths from inside relevant plugins
-    compileSourceRoots.add(new File(project.getBuild().getDirectory(),
-                                    "maven-i18n-plugin/main/javascript"));
-    compileSourceRoots.add(new File(project.getBuild().getDirectory(),
-                                    "maven-faces-plugin/main/javascript"));
-
-    try
-    {
-      Resource resource = new Resource();
-      resource.setDirectory(targetDirectory.getCanonicalPath());
-      project.addResource(resource);
-
-      // TODO: switch Optimized, not Debug, to be the special-case
-      //       so that Debug can be processed as ordinary resource copy
-      //       without having to explicitly code it here
-      File outputDirectory = new File(targetDirectory, targetPath);
-      outputDirectory.mkdirs();
-      for (Iterator i = compileSourceRoots.iterator(); i.hasNext(); )
-      {
-        File sourceRoot = (File)i.next();
-        File sourceDirectory = new File(sourceRoot, sourcePath);
-        if (sourceDirectory.exists())
-        {
-          _copyJavascript(sourceDirectory, outputDirectory);
-        }
-      }
-    }
-    catch (IOException e)
-    {
-      throw new MojoExecutionException("Error copying Javascript files", e);
-    }
-
-
-    try
-    {
-      if (optimizeTargetPath != null)
-      {
-        File outputDirectory = new File(targetDirectory, optimizeTargetPath);
-        outputDirectory.mkdirs();
-        for (Iterator i = compileSourceRoots.iterator(); i.hasNext(); )
-        {
-          File sourceRoot = (File)i.next();
-          File sourceDirectory = new File(sourceRoot, sourcePath);
-          if (sourceDirectory.exists())
-          {
-            String[] args = { sourceDirectory.getCanonicalPath(),
-                              outputDirectory.getCanonicalPath() };
-            // TODO: incremental check
-            Reducer.main(args);
-          }
-        }
-      }
-    }
-    catch (IOException e)
-    {
-      throw new MojoExecutionException("Error compiling Javascript files", e);
-    }
-  }
-
-  static private void _copyJavascript(File sourceDir, File targetDir)
-    throws IOException
-  {
-    File[] sourceFiles = sourceDir.listFiles();
-    if (sourceFiles != null)
-    {
-      for (File sourceFile : sourceFiles)
-      {
-        if (sourceFile.isDirectory())
-        {
-          File targetSubdir = new File(targetDir, sourceFile.getName());
-          if (!targetSubdir.exists())
-            targetSubdir.mkdir();
-          _copyJavascript(sourceFile, targetSubdir);
-        }
-        else if (sourceFile.getName().endsWith(".js"))
-        {
-          FileUtils.copyFileToDirectory(sourceFile, targetDir);
-        }
-      }
-    }
-  }
-
-  /**
-   * @parameter expression="${project}"
-   * @required
-   * @readonly
-   */
-  private MavenProject project;
-
-  /**
-   * @parameter expression="src/main/javascript"
-   * @required
-   */
-  private File sourceDirectory;
-
-  /**
-   * @parameter
-   * @required
-   */
-  private String sourcePath;
-
-  /**
-   * @parameter expression="${project.build.directory}/maven-javascript-plugin/main/resources"
-   * @required
-   */
-  private File targetDirectory;
-
-  /**
-   * @parameter
-   */
-  private String targetPath;
-
-  /**
-   * @parameter
-   */
-  private String optimizeTargetPath;
-
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAddOp.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAddOp.java
deleted file mode 100644
index d622bcf..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAddOp.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTAddOp.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTAddOp extends SimpleNode
-{
-  public ASTAddOp(int id)
-  {
-    super(id);
-  }
-
-  public ASTAddOp(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAdditiveExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAdditiveExpression.java
deleted file mode 100644
index 1f3e7f7..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAdditiveExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTAdditiveExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTAdditiveExpression extends SimpleNode
-{
-  public ASTAdditiveExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTAdditiveExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAnnotatableDirective.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAnnotatableDirective.java
deleted file mode 100644
index 3e906df..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAnnotatableDirective.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTAnnotatableDirective.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTAnnotatableDirective extends SimpleNode
-{
-  public ASTAnnotatableDirective(int id)
-  {
-    super(id);
-  }
-
-  public ASTAnnotatableDirective(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTArguments.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTArguments.java
deleted file mode 100644
index b5152c6..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTArguments.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTArguments.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTArguments extends SimpleNode
-{
-  public ASTArguments(int id)
-  {
-    super(id);
-  }
-
-  public ASTArguments(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTArrayLiteral.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTArrayLiteral.java
deleted file mode 100644
index 855dd49..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTArrayLiteral.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTArrayLiteral.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTArrayLiteral extends SimpleNode
-{
-  public ASTArrayLiteral(int id)
-  {
-    super(id);
-  }
-
-  public ASTArrayLiteral(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAssignementOperator.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAssignementOperator.java
deleted file mode 100644
index 0867e2d..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAssignementOperator.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTAssignementOperator.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTAssignementOperator extends SimpleNode
-{
-  public ASTAssignementOperator(int id)
-  {
-    super(id);
-  }
-
-  public ASTAssignementOperator(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAssignmentExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAssignmentExpression.java
deleted file mode 100644
index a79fe7d..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAssignmentExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTAssignmentExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTAssignmentExpression extends SimpleNode
-{
-  public ASTAssignmentExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTAssignmentExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAssignmentExpressionNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAssignmentExpressionNoIN.java
deleted file mode 100644
index 341f8a4..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAssignmentExpressionNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTAssignmentExpressionNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTAssignmentExpressionNoIN extends SimpleNode
-{
-  public ASTAssignmentExpressionNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTAssignmentExpressionNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAttribute.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAttribute.java
deleted file mode 100644
index 1774678..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAttribute.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTAttribute.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTAttribute extends SimpleNode
-{
-  public ASTAttribute(int id)
-  {
-    super(id);
-  }
-
-  public ASTAttribute(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAttributeExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAttributeExpression.java
deleted file mode 100644
index eb17a93..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAttributeExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTAttributeExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTAttributeExpression extends SimpleNode
-{
-  public ASTAttributeExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTAttributeExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAttributes.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAttributes.java
deleted file mode 100644
index 1bbf4d6..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTAttributes.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTAttributes.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTAttributes extends SimpleNode
-{
-  public ASTAttributes(int id)
-  {
-    super(id);
-  }
-
-  public ASTAttributes(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseANDExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseANDExpression.java
deleted file mode 100644
index b0512c8..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseANDExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTBitwiseANDExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTBitwiseANDExpression extends SimpleNode
-{
-  public ASTBitwiseANDExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTBitwiseANDExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseANDExpressionNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseANDExpressionNoIN.java
deleted file mode 100644
index 88f6aa6..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseANDExpressionNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTBitwiseANDExpressionNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTBitwiseANDExpressionNoIN extends SimpleNode
-{
-  public ASTBitwiseANDExpressionNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTBitwiseANDExpressionNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseANDOp.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseANDOp.java
deleted file mode 100644
index 635a313..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseANDOp.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTBitwiseANDOp.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTBitwiseANDOp extends SimpleNode
-{
-  public ASTBitwiseANDOp(int id)
-  {
-    super(id);
-  }
-
-  public ASTBitwiseANDOp(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseORExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseORExpression.java
deleted file mode 100644
index 3ded5a8..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseORExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTBitwiseORExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTBitwiseORExpression extends SimpleNode
-{
-  public ASTBitwiseORExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTBitwiseORExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseORExpressionNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseORExpressionNoIN.java
deleted file mode 100644
index be926fd..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseORExpressionNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTBitwiseORExpressionNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTBitwiseORExpressionNoIN extends SimpleNode
-{
-  public ASTBitwiseORExpressionNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTBitwiseORExpressionNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseOROp.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseOROp.java
deleted file mode 100644
index fc0a064..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseOROp.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTBitwiseOROp.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTBitwiseOROp extends SimpleNode
-{
-  public ASTBitwiseOROp(int id)
-  {
-    super(id);
-  }
-
-  public ASTBitwiseOROp(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseXORExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseXORExpression.java
deleted file mode 100644
index f381433..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseXORExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTBitwiseXORExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTBitwiseXORExpression extends SimpleNode
-{
-  public ASTBitwiseXORExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTBitwiseXORExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseXORExpressionNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseXORExpressionNoIN.java
deleted file mode 100644
index 571d38a..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseXORExpressionNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTBitwiseXORExpressionNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTBitwiseXORExpressionNoIN extends SimpleNode
-{
-  public ASTBitwiseXORExpressionNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTBitwiseXORExpressionNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseXOROp.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseXOROp.java
deleted file mode 100644
index 7959731..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBitwiseXOROp.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTBitwiseXOROp.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTBitwiseXOROp extends SimpleNode
-{
-  public ASTBitwiseXOROp(int id)
-  {
-    super(id);
-  }
-
-  public ASTBitwiseXOROp(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBlock.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBlock.java
deleted file mode 100644
index b117c65..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBlock.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTBlock.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTBlock extends SimpleNode
-{
-  public ASTBlock(int id)
-  {
-    super(id);
-  }
-
-  public ASTBlock(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBreakStatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBreakStatement.java
deleted file mode 100644
index 41b9e05..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTBreakStatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTBreakStatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTBreakStatement extends SimpleNode
-{
-  public ASTBreakStatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTBreakStatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTCaseElement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTCaseElement.java
deleted file mode 100644
index 1e8d203..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTCaseElement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTCaseElement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTCaseElement extends SimpleNode
-{
-  public ASTCaseElement(int id)
-  {
-    super(id);
-  }
-
-  public ASTCaseElement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTCaseElements.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTCaseElements.java
deleted file mode 100644
index 3b88598..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTCaseElements.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTCaseElements.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTCaseElements extends SimpleNode
-{
-  public ASTCaseElements(int id)
-  {
-    super(id);
-  }
-
-  public ASTCaseElements(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTCaseLabel.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTCaseLabel.java
deleted file mode 100644
index ed5a754..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTCaseLabel.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTCaseLabel.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTCaseLabel extends SimpleNode
-{
-  public ASTCaseLabel(int id)
-  {
-    super(id);
-  }
-
-  public ASTCaseLabel(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTClassDefinition.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTClassDefinition.java
deleted file mode 100644
index 30e6a3a..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTClassDefinition.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTClassDefinition.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTClassDefinition extends SimpleNode
-{
-  public ASTClassDefinition(int id)
-  {
-    super(id);
-  }
-
-  public ASTClassDefinition(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTConditionalExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTConditionalExpression.java
deleted file mode 100644
index 9c68e2c..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTConditionalExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTConditionalExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTConditionalExpression extends SimpleNode
-{
-  public ASTConditionalExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTConditionalExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTConditionalExpressionNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTConditionalExpressionNoIN.java
deleted file mode 100644
index c76e4e2..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTConditionalExpressionNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTConditionalExpressionNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTConditionalExpressionNoIN extends SimpleNode
-{
-  public ASTConditionalExpressionNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTConditionalExpressionNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTContinueStatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTContinueStatement.java
deleted file mode 100644
index 83f19c4..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTContinueStatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTContinueStatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTContinueStatement extends SimpleNode
-{
-  public ASTContinueStatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTContinueStatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTDirective.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTDirective.java
deleted file mode 100644
index 8133133..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTDirective.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTDirective.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTDirective extends SimpleNode
-{
-  public ASTDirective(int id)
-  {
-    super(id);
-  }
-
-  public ASTDirective(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTDirectives.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTDirectives.java
deleted file mode 100644
index c7d8a17..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTDirectives.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTDirectives.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTDirectives extends SimpleNode
-{
-  public ASTDirectives(int id)
-  {
-    super(id);
-  }
-
-  public ASTDirectives(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTDoStatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTDoStatement.java
deleted file mode 100644
index 892674a..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTDoStatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTDoStatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTDoStatement extends SimpleNode
-{
-  public ASTDoStatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTDoStatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTElementList.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTElementList.java
deleted file mode 100644
index 0d657d3..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTElementList.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTElementList.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTElementList extends SimpleNode
-{
-  public ASTElementList(int id)
-  {
-    super(id);
-  }
-
-  public ASTElementList(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTEmptyStatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTEmptyStatement.java
deleted file mode 100644
index ec6bfbb..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTEmptyStatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTEmptyStatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTEmptyStatement extends SimpleNode
-{
-  public ASTEmptyStatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTEmptyStatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTEolCommentSkipWs.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTEolCommentSkipWs.java
deleted file mode 100644
index c5e20c5..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTEolCommentSkipWs.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTEolCommentSkipWs.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTEolCommentSkipWs extends SimpleNode
-{
-  public ASTEolCommentSkipWs(int id)
-  {
-    super(id);
-  }
-
-  public ASTEolCommentSkipWs(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTEqualOp.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTEqualOp.java
deleted file mode 100644
index 0008b50..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTEqualOp.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTEqualOp.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTEqualOp extends SimpleNode
-{
-  public ASTEqualOp(int id)
-  {
-    super(id);
-  }
-
-  public ASTEqualOp(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTEqualityExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTEqualityExpression.java
deleted file mode 100644
index 0ec184a..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTEqualityExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTEqualityExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTEqualityExpression extends SimpleNode
-{
-  public ASTEqualityExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTEqualityExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTEqualityExpressionNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTEqualityExpressionNoIN.java
deleted file mode 100644
index 36a4708..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTEqualityExpressionNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTEqualityExpressionNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTEqualityExpressionNoIN extends SimpleNode
-{
-  public ASTEqualityExpressionNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTEqualityExpressionNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTExportBinding.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTExportBinding.java
deleted file mode 100644
index 3c3f0af..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTExportBinding.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTExportBinding.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTExportBinding extends SimpleNode
-{
-  public ASTExportBinding(int id)
-  {
-    super(id);
-  }
-
-  public ASTExportBinding(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTExportBindingList.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTExportBindingList.java
deleted file mode 100644
index 398dbca..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTExportBindingList.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTExportBindingList.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTExportBindingList extends SimpleNode
-{
-  public ASTExportBindingList(int id)
-  {
-    super(id);
-  }
-
-  public ASTExportBindingList(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTExportDefinition.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTExportDefinition.java
deleted file mode 100644
index d03a638..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTExportDefinition.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTExportDefinition.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTExportDefinition extends SimpleNode
-{
-  public ASTExportDefinition(int id)
-  {
-    super(id);
-  }
-
-  public ASTExportDefinition(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTExpressionQualifiedIdentifier.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTExpressionQualifiedIdentifier.java
deleted file mode 100644
index e6d3c5f..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTExpressionQualifiedIdentifier.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTExpressionQualifiedIdentifier.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTExpressionQualifiedIdentifier extends SimpleNode
-{
-  public ASTExpressionQualifiedIdentifier(int id)
-  {
-    super(id);
-  }
-
-  public ASTExpressionQualifiedIdentifier(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTExpressionStatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTExpressionStatement.java
deleted file mode 100644
index ce77e46..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTExpressionStatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTExpressionStatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTExpressionStatement extends SimpleNode
-{
-  public ASTExpressionStatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTExpressionStatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFieldList.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFieldList.java
deleted file mode 100644
index cb18271..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFieldList.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTFieldList.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTFieldList extends SimpleNode
-{
-  public ASTFieldList(int id)
-  {
-    super(id);
-  }
-
-  public ASTFieldList(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFieldName.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFieldName.java
deleted file mode 100644
index b1bd541..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFieldName.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTFieldName.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTFieldName extends SimpleNode
-{
-  public ASTFieldName(int id)
-  {
-    super(id);
-  }
-
-  public ASTFieldName(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTForInBinding.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTForInBinding.java
deleted file mode 100644
index 3f33129..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTForInBinding.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTForInBinding.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTForInBinding extends SimpleNode
-{
-  public ASTForInBinding(int id)
-  {
-    super(id);
-  }
-
-  public ASTForInBinding(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTForInitializer.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTForInitializer.java
deleted file mode 100644
index 79dd86b..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTForInitializer.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTForInitializer.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTForInitializer extends SimpleNode
-{
-  public ASTForInitializer(int id)
-  {
-    super(id);
-  }
-
-  public ASTForInitializer(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTForStatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTForStatement.java
deleted file mode 100644
index 49991d9..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTForStatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTForStatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTForStatement extends SimpleNode
-{
-  public ASTForStatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTForStatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFullNewExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFullNewExpression.java
deleted file mode 100644
index 8d559b0..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFullNewExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTFullNewExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTFullNewExpression extends SimpleNode
-{
-  public ASTFullNewExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTFullNewExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFullNewSubexpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFullNewSubexpression.java
deleted file mode 100644
index 2b80b4d..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFullNewSubexpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTFullNewSubexpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTFullNewSubexpression extends SimpleNode
-{
-  public ASTFullNewSubexpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTFullNewSubexpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFullPostfixExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFullPostfixExpression.java
deleted file mode 100644
index 8cba904..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFullPostfixExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTFullPostfixExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTFullPostfixExpression extends SimpleNode
-{
-  public ASTFullPostfixExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTFullPostfixExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFunctionCommon.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFunctionCommon.java
deleted file mode 100644
index 7f90649..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFunctionCommon.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTFunctionCommon.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTFunctionCommon extends SimpleNode
-{
-  public ASTFunctionCommon(int id)
-  {
-    super(id);
-  }
-
-  public ASTFunctionCommon(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFunctionConstructor.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFunctionConstructor.java
deleted file mode 100644
index b118128..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFunctionConstructor.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTFunctionConstructor.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTFunctionConstructor extends SimpleNode
-{
-  public ASTFunctionConstructor(int id)
-  {
-    super(id);
-  }
-
-  public ASTFunctionConstructor(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFunctionDefinition.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFunctionDefinition.java
deleted file mode 100644
index 16cb8ea..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFunctionDefinition.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTFunctionDefinition.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTFunctionDefinition extends SimpleNode
-{
-  public ASTFunctionDefinition(int id)
-  {
-    super(id);
-  }
-
-  public ASTFunctionDefinition(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFunctionExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFunctionExpression.java
deleted file mode 100644
index eb83739..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFunctionExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTFunctionExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTFunctionExpression extends SimpleNode
-{
-  public ASTFunctionExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTFunctionExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFunctionName.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFunctionName.java
deleted file mode 100644
index 2c23533..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTFunctionName.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTFunctionName.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTFunctionName extends SimpleNode
-{
-  public ASTFunctionName(int id)
-  {
-    super(id);
-  }
-
-  public ASTFunctionName(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTIdentifier.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTIdentifier.java
deleted file mode 100644
index 41eb6c0..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTIdentifier.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTIdentifier.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTIdentifier extends SimpleNode
-{
-  public ASTIdentifier(int id)
-  {
-    super(id);
-  }
-
-  public ASTIdentifier(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTIfStatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTIfStatement.java
deleted file mode 100644
index 37d0511..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTIfStatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTIfStatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTIfStatement extends SimpleNode
-{
-  public ASTIfStatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTIfStatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTImportDirective.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTImportDirective.java
deleted file mode 100644
index fc559d0..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTImportDirective.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTImportDirective.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTImportDirective extends SimpleNode
-{
-  public ASTImportDirective(int id)
-  {
-    super(id);
-  }
-
-  public ASTImportDirective(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTIncludeDirective.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTIncludeDirective.java
deleted file mode 100644
index 856a0f0..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTIncludeDirective.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTIncludeDirective.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTIncludeDirective extends SimpleNode
-{
-  public ASTIncludeDirective(int id)
-  {
-    super(id);
-  }
-
-  public ASTIncludeDirective(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTInheritance.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTInheritance.java
deleted file mode 100644
index a263bfc..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTInheritance.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTInheritance.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTInheritance extends SimpleNode
-{
-  public ASTInheritance(int id)
-  {
-    super(id);
-  }
-
-  public ASTInheritance(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTInterfaceDefinition.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTInterfaceDefinition.java
deleted file mode 100644
index a1bf371..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTInterfaceDefinition.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTInterfaceDefinition.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTInterfaceDefinition extends SimpleNode
-{
-  public ASTInterfaceDefinition(int id)
-  {
-    super(id);
-  }
-
-  public ASTInterfaceDefinition(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLabeledStatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLabeledStatement.java
deleted file mode 100644
index b809d7e..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLabeledStatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTLabeledStatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTLabeledStatement extends SimpleNode
-{
-  public ASTLabeledStatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTLabeledStatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTListExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTListExpression.java
deleted file mode 100644
index 54df066..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTListExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTListExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTListExpression extends SimpleNode
-{
-  public ASTListExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTListExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTListExpressionNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTListExpressionNoIN.java
deleted file mode 100644
index 91dc498..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTListExpressionNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTListExpressionNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTListExpressionNoIN extends SimpleNode
-{
-  public ASTListExpressionNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTListExpressionNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLiteralElement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLiteralElement.java
deleted file mode 100644
index d807dcb..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLiteralElement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTLiteralElement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTLiteralElement extends SimpleNode
-{
-  public ASTLiteralElement(int id)
-  {
-    super(id);
-  }
-
-  public ASTLiteralElement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLiteralField.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLiteralField.java
deleted file mode 100644
index c9b0cf1..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLiteralField.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTLiteralField.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTLiteralField extends SimpleNode
-{
-  public ASTLiteralField(int id)
-  {
-    super(id);
-  }
-
-  public ASTLiteralField(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLogicalANDExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLogicalANDExpression.java
deleted file mode 100644
index 25837d5..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLogicalANDExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTLogicalANDExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTLogicalANDExpression extends SimpleNode
-{
-  public ASTLogicalANDExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTLogicalANDExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLogicalANDExpressionNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLogicalANDExpressionNoIN.java
deleted file mode 100644
index 0a3d9e1..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLogicalANDExpressionNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTLogicalANDExpressionNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTLogicalANDExpressionNoIN extends SimpleNode
-{
-  public ASTLogicalANDExpressionNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTLogicalANDExpressionNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLogicalORExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLogicalORExpression.java
deleted file mode 100644
index f3c577c..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLogicalORExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTLogicalORExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTLogicalORExpression extends SimpleNode
-{
-  public ASTLogicalORExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTLogicalORExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLogicalORExpressionNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLogicalORExpressionNoIN.java
deleted file mode 100644
index a91c7f6..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTLogicalORExpressionNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTLogicalORExpressionNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTLogicalORExpressionNoIN extends SimpleNode
-{
-  public ASTLogicalORExpressionNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTLogicalORExpressionNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTMulOp.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTMulOp.java
deleted file mode 100644
index 76434d3..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTMulOp.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTMulOp.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTMulOp extends SimpleNode
-{
-  public ASTMulOp(int id)
-  {
-    super(id);
-  }
-
-  public ASTMulOp(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTMultiplicativeExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTMultiplicativeExpression.java
deleted file mode 100644
index 691cbc1..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTMultiplicativeExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTMultiplicativeExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTMultiplicativeExpression extends SimpleNode
-{
-  public ASTMultiplicativeExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTMultiplicativeExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTNamespaceDefinition.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTNamespaceDefinition.java
deleted file mode 100644
index 8ee520a..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTNamespaceDefinition.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTNamespaceDefinition.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTNamespaceDefinition extends SimpleNode
-{
-  public ASTNamespaceDefinition(int id)
-  {
-    super(id);
-  }
-
-  public ASTNamespaceDefinition(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTNonAssignmentExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTNonAssignmentExpression.java
deleted file mode 100644
index cd55c27..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTNonAssignmentExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTNonAssignmentExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTNonAssignmentExpression extends SimpleNode
-{
-  public ASTNonAssignmentExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTNonAssignmentExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTNonAssignmentExpressionNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTNonAssignmentExpressionNoIN.java
deleted file mode 100644
index 80d1a92..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTNonAssignmentExpressionNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTNonAssignmentExpressionNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTNonAssignmentExpressionNoIN extends SimpleNode
-{
-  public ASTNonAssignmentExpressionNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTNonAssignmentExpressionNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTObjectLiteral.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTObjectLiteral.java
deleted file mode 100644
index d1cd137..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTObjectLiteral.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTObjectLiteral.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTObjectLiteral extends SimpleNode
-{
-  public ASTObjectLiteral(int id)
-  {
-    super(id);
-  }
-
-  public ASTObjectLiteral(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPackageDefinition.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPackageDefinition.java
deleted file mode 100644
index 69cc6d4..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPackageDefinition.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTPackageDefinition.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTPackageDefinition extends SimpleNode
-{
-  public ASTPackageDefinition(int id)
-  {
-    super(id);
-  }
-
-  public ASTPackageDefinition(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPackageIdentifiers.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPackageIdentifiers.java
deleted file mode 100644
index b49f575..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPackageIdentifiers.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTPackageIdentifiers.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTPackageIdentifiers extends SimpleNode
-{
-  public ASTPackageIdentifiers(int id)
-  {
-    super(id);
-  }
-
-  public ASTPackageIdentifiers(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPackageName.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPackageName.java
deleted file mode 100644
index 6dbcde0..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPackageName.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTPackageName.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTPackageName extends SimpleNode
-{
-  public ASTPackageName(int id)
-  {
-    super(id);
-  }
-
-  public ASTPackageName(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTParameter.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTParameter.java
deleted file mode 100644
index ff38064..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTParameter.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTParameter.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTParameter extends SimpleNode
-{
-  public ASTParameter(int id)
-  {
-    super(id);
-  }
-
-  public ASTParameter(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTParameterInit.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTParameterInit.java
deleted file mode 100644
index 35e3a45..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTParameterInit.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTParameterInit.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTParameterInit extends SimpleNode
-{
-  public ASTParameterInit(int id)
-  {
-    super(id);
-  }
-
-  public ASTParameterInit(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTParameters.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTParameters.java
deleted file mode 100644
index 9ab2cb5..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTParameters.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTParameters.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTParameters extends SimpleNode
-{
-  public ASTParameters(int id)
-  {
-    super(id);
-  }
-
-  public ASTParameters(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPostfixExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPostfixExpression.java
deleted file mode 100644
index 28fd49b..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPostfixExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTPostfixExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTPostfixExpression extends SimpleNode
-{
-  public ASTPostfixExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTPostfixExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPostfixOp.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPostfixOp.java
deleted file mode 100644
index f122e84..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPostfixOp.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTPostfixOp.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTPostfixOp extends SimpleNode
-{
-  public ASTPostfixOp(int id)
-  {
-    super(id);
-  }
-
-  public ASTPostfixOp(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPragma.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPragma.java
deleted file mode 100644
index a807ef3..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPragma.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTPragma.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTPragma extends SimpleNode
-{
-  public ASTPragma(int id)
-  {
-    super(id);
-  }
-
-  public ASTPragma(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPragmaArgument.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPragmaArgument.java
deleted file mode 100644
index e1074e7..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPragmaArgument.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTPragmaArgument.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTPragmaArgument extends SimpleNode
-{
-  public ASTPragmaArgument(int id)
-  {
-    super(id);
-  }
-
-  public ASTPragmaArgument(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPragmaExpr.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPragmaExpr.java
deleted file mode 100644
index 2eae181..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPragmaExpr.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTPragmaExpr.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTPragmaExpr extends SimpleNode
-{
-  public ASTPragmaExpr(int id)
-  {
-    super(id);
-  }
-
-  public ASTPragmaExpr(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPragmaItem.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPragmaItem.java
deleted file mode 100644
index 115615b..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPragmaItem.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTPragmaItem.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTPragmaItem extends SimpleNode
-{
-  public ASTPragmaItem(int id)
-  {
-    super(id);
-  }
-
-  public ASTPragmaItem(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPragmaItems.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPragmaItems.java
deleted file mode 100644
index 21a167e..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPragmaItems.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTPragmaItems.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTPragmaItems extends SimpleNode
-{
-  public ASTPragmaItems(int id)
-  {
-    super(id);
-  }
-
-  public ASTPragmaItems(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPrimaryExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPrimaryExpression.java
deleted file mode 100644
index 690e719..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPrimaryExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTPrimaryExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTPrimaryExpression extends SimpleNode
-{
-  public ASTPrimaryExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTPrimaryExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTProgram.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTProgram.java
deleted file mode 100644
index 64ac75e..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTProgram.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTProgram.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTProgram extends SimpleNode
-{
-  public ASTProgram(int id)
-  {
-    super(id);
-  }
-
-  public ASTProgram(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPropertyOperator.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPropertyOperator.java
deleted file mode 100644
index d5dde4e..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPropertyOperator.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTPropertyOperator.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTPropertyOperator extends SimpleNode
-{
-  public ASTPropertyOperator(int id)
-  {
-    super(id);
-  }
-
-  public ASTPropertyOperator(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPropertyOrArguments.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPropertyOrArguments.java
deleted file mode 100644
index 888e7f7..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTPropertyOrArguments.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTPropertyOrArguments.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTPropertyOrArguments extends SimpleNode
-{
-  public ASTPropertyOrArguments(int id)
-  {
-    super(id);
-  }
-
-  public ASTPropertyOrArguments(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTQualifiedIdentifier.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTQualifiedIdentifier.java
deleted file mode 100644
index 03179a6..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTQualifiedIdentifier.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTQualifiedIdentifier.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTQualifiedIdentifier extends SimpleNode
-{
-  public ASTQualifiedIdentifier(int id)
-  {
-    super(id);
-  }
-
-  public ASTQualifiedIdentifier(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTRelOp.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTRelOp.java
deleted file mode 100644
index c714750..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTRelOp.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTRelOp.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTRelOp extends SimpleNode
-{
-  public ASTRelOp(int id)
-  {
-    super(id);
-  }
-
-  public ASTRelOp(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTRelationalExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTRelationalExpression.java
deleted file mode 100644
index 5df3b79..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTRelationalExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTRelationalExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTRelationalExpression extends SimpleNode
-{
-  public ASTRelationalExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTRelationalExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTRelationalExpressionNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTRelationalExpressionNoIN.java
deleted file mode 100644
index 3ea1ad6..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTRelationalExpressionNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTRelationalExpressionNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTRelationalExpressionNoIN extends SimpleNode
-{
-  public ASTRelationalExpressionNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTRelationalExpressionNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTReservedNamespace.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTReservedNamespace.java
deleted file mode 100644
index 6036bd3..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTReservedNamespace.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTReservedNamespace.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTReservedNamespace extends SimpleNode
-{
-  public ASTReservedNamespace(int id)
-  {
-    super(id);
-  }
-
-  public ASTReservedNamespace(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTRestParameters.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTRestParameters.java
deleted file mode 100644
index 3eb3ddb..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTRestParameters.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTRestParameters.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTRestParameters extends SimpleNode
-{
-  public ASTRestParameters(int id)
-  {
-    super(id);
-  }
-
-  public ASTRestParameters(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTResult.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTResult.java
deleted file mode 100644
index e1fa1bf..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTResult.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTResult.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTResult extends SimpleNode
-{
-  public ASTResult(int id)
-  {
-    super(id);
-  }
-
-  public ASTResult(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTReturnStatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTReturnStatement.java
deleted file mode 100644
index 6a68302..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTReturnStatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTReturnStatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTReturnStatement extends SimpleNode
-{
-  public ASTReturnStatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTReturnStatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSc.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSc.java
deleted file mode 100644
index 67f4cfb..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSc.java
+++ /dev/null
@@ -1,44 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTSc.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser.JSParser20Constants;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser.Token;
-
-public class ASTSc extends SimpleNode implements JSParser20Constants
-{
-  public ASTSc(int id)
-  {
-    super(id);
-  }
-
-  public ASTSc(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTShiftExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTShiftExpression.java
deleted file mode 100644
index 685e01c..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTShiftExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTShiftExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTShiftExpression extends SimpleNode
-{
-  public ASTShiftExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTShiftExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTShiftOp.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTShiftOp.java
deleted file mode 100644
index 7a53bef..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTShiftOp.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTShiftOp.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTShiftOp extends SimpleNode
-{
-  public ASTShiftOp(int id)
-  {
-    super(id);
-  }
-
-  public ASTShiftOp(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSimpleQualifiedIdentifier.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSimpleQualifiedIdentifier.java
deleted file mode 100644
index 6e7b620..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSimpleQualifiedIdentifier.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTSimpleQualifiedIdentifier.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTSimpleQualifiedIdentifier extends SimpleNode
-{
-  public ASTSimpleQualifiedIdentifier(int id)
-  {
-    super(id);
-  }
-
-  public ASTSimpleQualifiedIdentifier(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSimpleVariableDefinition.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSimpleVariableDefinition.java
deleted file mode 100644
index 12fc0fa..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSimpleVariableDefinition.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTSimpleVariableDefinition.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTSimpleVariableDefinition extends SimpleNode
-{
-  public ASTSimpleVariableDefinition(int id)
-  {
-    super(id);
-  }
-
-  public ASTSimpleVariableDefinition(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTStatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTStatement.java
deleted file mode 100644
index 998ff8f..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTStatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTStatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTStatement extends SimpleNode
-{
-  public ASTStatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTStatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSubstatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSubstatement.java
deleted file mode 100644
index 6bb1602..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSubstatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTSubstatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTSubstatement extends SimpleNode
-{
-  public ASTSubstatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTSubstatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSubstatements.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSubstatements.java
deleted file mode 100644
index fe95425..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSubstatements.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTSubstatements.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTSubstatements extends SimpleNode
-{
-  public ASTSubstatements(int id)
-  {
-    super(id);
-  }
-
-  public ASTSubstatements(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSuperExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSuperExpression.java
deleted file mode 100644
index 3141a1c..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSuperExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTSuperExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTSuperExpression extends SimpleNode
-{
-  public ASTSuperExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTSuperExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSuperStatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSuperStatement.java
deleted file mode 100644
index 114c86e..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSuperStatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTSuperStatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTSuperStatement extends SimpleNode
-{
-  public ASTSuperStatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTSuperStatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSwitchStatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSwitchStatement.java
deleted file mode 100644
index 1c2b107..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTSwitchStatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTSwitchStatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTSwitchStatement extends SimpleNode
-{
-  public ASTSwitchStatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTSwitchStatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTThrowStatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTThrowStatement.java
deleted file mode 100644
index ea498e6..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTThrowStatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTThrowStatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTThrowStatement extends SimpleNode
-{
-  public ASTThrowStatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTThrowStatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTryStatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTryStatement.java
deleted file mode 100644
index 8cf3d9c..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTryStatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTTryStatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTTryStatement extends SimpleNode
-{
-  public ASTTryStatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTTryStatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTypeExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTypeExpression.java
deleted file mode 100644
index 02b6588..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTypeExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTTypeExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTTypeExpression extends SimpleNode
-{
-  public ASTTypeExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTTypeExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTypeExpressionList.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTypeExpressionList.java
deleted file mode 100644
index 2e78282..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTypeExpressionList.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTTypeExpressionList.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTTypeExpressionList extends SimpleNode
-{
-  public ASTTypeExpressionList(int id)
-  {
-    super(id);
-  }
-
-  public ASTTypeExpressionList(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTypeExpressionNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTypeExpressionNoIN.java
deleted file mode 100644
index bd4ec2b..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTypeExpressionNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTTypeExpressionNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTTypeExpressionNoIN extends SimpleNode
-{
-  public ASTTypeExpressionNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTTypeExpressionNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTypedIdentifier.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTypedIdentifier.java
deleted file mode 100644
index 9888a84..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTypedIdentifier.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTTypedIdentifier.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTTypedIdentifier extends SimpleNode
-{
-  public ASTTypedIdentifier(int id)
-  {
-    super(id);
-  }
-
-  public ASTTypedIdentifier(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTypedIdentifierNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTypedIdentifierNoIN.java
deleted file mode 100644
index 1aaefa0..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTTypedIdentifierNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTTypedIdentifierNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTTypedIdentifierNoIN extends SimpleNode
-{
-  public ASTTypedIdentifierNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTTypedIdentifierNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTUnaryExpression.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTUnaryExpression.java
deleted file mode 100644
index 15cbc4d..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTUnaryExpression.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTUnaryExpression.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTUnaryExpression extends SimpleNode
-{
-  public ASTUnaryExpression(int id)
-  {
-    super(id);
-  }
-
-  public ASTUnaryExpression(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTUntypedVariableBinding.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTUntypedVariableBinding.java
deleted file mode 100644
index 83c7abe..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTUntypedVariableBinding.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTUntypedVariableBinding.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTUntypedVariableBinding extends SimpleNode
-{
-  public ASTUntypedVariableBinding(int id)
-  {
-    super(id);
-  }
-
-  public ASTUntypedVariableBinding(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTUntypedVariableBindingList.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTUntypedVariableBindingList.java
deleted file mode 100644
index dcbf5dd..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTUntypedVariableBindingList.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTUntypedVariableBindingList.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTUntypedVariableBindingList extends SimpleNode
-{
-  public ASTUntypedVariableBindingList(int id)
-  {
-    super(id);
-  }
-
-  public ASTUntypedVariableBindingList(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTUseDirective.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTUseDirective.java
deleted file mode 100644
index 91a9f16..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTUseDirective.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTUseDirective.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTUseDirective extends SimpleNode
-{
-  public ASTUseDirective(int id)
-  {
-    super(id);
-  }
-
-  public ASTUseDirective(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableBinding.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableBinding.java
deleted file mode 100644
index f7515d1..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableBinding.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTVariableBinding.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTVariableBinding extends SimpleNode
-{
-  public ASTVariableBinding(int id)
-  {
-    super(id);
-  }
-
-  public ASTVariableBinding(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableBindingList.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableBindingList.java
deleted file mode 100644
index 9e9926e..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableBindingList.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTVariableBindingList.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTVariableBindingList extends SimpleNode
-{
-  public ASTVariableBindingList(int id)
-  {
-    super(id);
-  }
-
-  public ASTVariableBindingList(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableBindingListNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableBindingListNoIN.java
deleted file mode 100644
index 985d426..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableBindingListNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTVariableBindingListNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTVariableBindingListNoIN extends SimpleNode
-{
-  public ASTVariableBindingListNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTVariableBindingListNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableBindingNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableBindingNoIN.java
deleted file mode 100644
index bf50884..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableBindingNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTVariableBindingNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTVariableBindingNoIN extends SimpleNode
-{
-  public ASTVariableBindingNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTVariableBindingNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableDefinition.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableDefinition.java
deleted file mode 100644
index 1081fe8..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableDefinition.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTVariableDefinition.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTVariableDefinition extends SimpleNode
-{
-  public ASTVariableDefinition(int id)
-  {
-    super(id);
-  }
-
-  public ASTVariableDefinition(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableDefinitionKind.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableDefinitionKind.java
deleted file mode 100644
index d2a686b..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableDefinitionKind.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTVariableDefinitionKind.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTVariableDefinitionKind extends SimpleNode
-{
-  public ASTVariableDefinitionKind(int id)
-  {
-    super(id);
-  }
-
-  public ASTVariableDefinitionKind(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableDefinitionNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableDefinitionNoIN.java
deleted file mode 100644
index 4e9654f..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableDefinitionNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTVariableDefinitionNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTVariableDefinitionNoIN extends SimpleNode
-{
-  public ASTVariableDefinitionNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTVariableDefinitionNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableInitialisation.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableInitialisation.java
deleted file mode 100644
index a04a36b..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableInitialisation.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTVariableInitialisation.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTVariableInitialisation extends SimpleNode
-{
-  public ASTVariableInitialisation(int id)
-  {
-    super(id);
-  }
-
-  public ASTVariableInitialisation(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableInitialisationNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableInitialisationNoIN.java
deleted file mode 100644
index 1e3cbc9..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableInitialisationNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTVariableInitialisationNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTVariableInitialisationNoIN extends SimpleNode
-{
-  public ASTVariableInitialisationNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTVariableInitialisationNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableInitializer.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableInitializer.java
deleted file mode 100644
index 5f1f3b9..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableInitializer.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTVariableInitializer.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTVariableInitializer extends SimpleNode
-{
-  public ASTVariableInitializer(int id)
-  {
-    super(id);
-  }
-
-  public ASTVariableInitializer(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableInitializerNoIN.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableInitializerNoIN.java
deleted file mode 100644
index 8c3b499..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTVariableInitializerNoIN.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTVariableInitializerNoIN.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTVariableInitializerNoIN extends SimpleNode
-{
-  public ASTVariableInitializerNoIN(int id)
-  {
-    super(id);
-  }
-
-  public ASTVariableInitializerNoIN(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTWhileStatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTWhileStatement.java
deleted file mode 100644
index db664c7..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTWhileStatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTWhileStatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTWhileStatement extends SimpleNode
-{
-  public ASTWhileStatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTWhileStatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTWithStatement.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTWithStatement.java
deleted file mode 100644
index ca9810b..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ASTWithStatement.java
+++ /dev/null
@@ -1,41 +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.
- */
-/* Generated By:JJTree: Do not edit this line. ASTWithStatement.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class ASTWithStatement extends SimpleNode
-{
-  public ASTWithStatement(int id)
-  {
-    super(id);
-  }
-
-  public ASTWithStatement(JSParser20 p, int id)
-  {
-    super(p, id);
-  }
-
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JJTJSParser20State.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JJTJSParser20State.java
deleted file mode 100644
index 442cb43..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JJTJSParser20State.java
+++ /dev/null
@@ -1,170 +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.
- */
-/* Generated By:JJTree: Do not edit this line. .\JJTJSParser20State.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-class JJTJSParser20State
-{
-  private java.util.Stack nodes;
-  private java.util.Stack marks;
-
-  private int     sp;// number of nodes on stack
-  private int     mk;// current mark
-  private boolean node_created;
-
-  JJTJSParser20State()
-  {
-    nodes = new java.util.Stack();
-    marks = new java.util.Stack();
-    sp = 0;
-    mk = 0;
-  }
-
-  /* Determines whether the current node was actually closed and
-     pushed.  This should only be called in the final user action of a
-     node scope.  */
-  boolean nodeCreated()
-  {
-    return node_created;
-  }
-
-  /* Call this to reinitialize the node stack.  It is called
-     automatically by the parser's ReInit() method. */
-  void reset()
-  {
-    nodes.removeAllElements();
-    marks.removeAllElements();
-    sp = 0;
-    mk = 0;
-  }
-
-  /* Returns the root node of the AST.  It only makes sense to call
-     this after a successful parse. */
-  Node rootNode()
-  {
-    return (Node) nodes.elementAt(0);
-  }
-
-  /* Pushes a node on to the stack. */
-  void pushNode(Node n)
-  {
-    nodes.push(n);
-    ++sp;
-  }
-
-  /* Returns the node on the top of the stack, and remove it from the
-     stack.  */
-  Node popNode()
-  {
-
-    if (--sp < mk)
-    {
-      mk = ((Integer) marks.pop()).intValue();
-    }
-
-    return (Node) nodes.pop();
-  }
-
-  /* Returns the node currently on the top of the stack. */
-  Node peekNode()
-  {
-    return (Node) nodes.peek();
-  }
-
-  /* Returns the number of children on the stack in the current node
-     scope. */
-  int nodeArity()
-  {
-    return sp - mk;
-  }
-
-
-  void clearNodeScope(Node n)
-  {
-
-    while (sp > mk)
-    {
-      popNode();
-    }
-
-    mk = ((Integer) marks.pop()).intValue();
-  }
-
-
-  void openNodeScope(Node n)
-  {
-    marks.push(new Integer(mk));
-    mk = sp;
-    n.jjtOpen();
-  }
-
-
-  /* A definite node is constructed from a specified number of
-     children.  That number of nodes are popped from the stack and
-     made the children of the definite node.  Then the definite node
-     is pushed on to the stack. */
-  void closeNodeScope(Node n, int num)
-  {
-    mk = ((Integer) marks.pop()).intValue();
-
-    while (num-- > 0)
-    {
-      Node c = popNode();
-      c.jjtSetParent(n);
-      n.jjtAddChild(c, num);
-    }
-
-    n.jjtClose();
-    pushNode(n);
-    node_created = true;
-  }
-
-
-  /* A conditional node is constructed if its condition is true.  All
-     the nodes that have been pushed since the node was opened are
-     made children of the the conditional node, which is then pushed
-     on to the stack.  If the condition is false the node is not
-     constructed and they are left on the stack. */
-  void closeNodeScope(Node n, boolean condition)
-  {
-
-    if (condition)
-    {
-      int a = nodeArity();
-      mk = ((Integer) marks.pop()).intValue();
-
-      while (a-- > 0)
-      {
-        Node c = popNode();
-        c.jjtSetParent(n);
-        n.jjtAddChild(c, a);
-      }
-
-      n.jjtClose();
-      pushNode(n);
-      node_created = true;
-    }
-    else
-    {
-      mk = ((Integer) marks.pop()).intValue();
-      node_created = false;
-    }
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JSParser20.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JSParser20.java
deleted file mode 100644
index 081534d..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JSParser20.java
+++ /dev/null
@@ -1,9410 +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.
- */
-/* Generated By:JJTree&JavaCC: Do not edit this line. JSParser20.java */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-import java.io.IOException;
-public class JSParser20/*@bgen(jjtree)*/implements JSParser20TreeConstants, JSParser20Constants {/*@bgen(jjtree)*/
-  protected JJTJSParser20State jjtree = new JJTJSParser20State();//
-    // This is the root node for the parse tree (root DOM node, tree of SimpleNode(s))
-    //
-    protected ASTProgram _jjtRoot;
-
-    public ASTProgram getRootNode()
-    {
-        return _jjtRoot;
-    }
-
-///////////////////////////////////////////////////////////////////
-// GRAMMAR Section
-///////////////////////////////////////////////////////////////////
-  final public Token Program() throws ParseException {
- /*@bgen(jjtree) Program */
-        ASTProgram jjtn000 = new ASTProgram(this, JJTPROGRAM);
-        boolean jjtc000 = true;
-        jjtree.openNodeScope(jjtn000);Token retval = getToken(1);
-    try {
-      label_1:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case PACKAGE:
-          ;
-          break;
-        default:
-          jj_la1[0] = jj_gen;
-          break label_1;
-        }
-        PackageDefinition();
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BREAK:
-      case CLASS:
-      case CONST:
-      case CONTINUE:
-      case DELETE:
-      case DO:
-      case FALSE:
-      case FOR:
-      case FUNCTION:
-      case GET:
-      case IF:
-      case INCLUDE:
-      case NAMESPACE:
-      case NEW:
-      case NULL:
-      case PRIVATE:
-      case PUBLIC:
-      case RETURN:
-      case SET:
-      case SUPER:
-      case SWITCH:
-      case THIS:
-      case THROW:
-      case TRUE:
-      case TRY:
-      case TYPEOF:
-      case USE:
-      case VAR:
-      case VOID:
-      case WHILE:
-      case WITH:
-      case EXPORT:
-      case INTERFACE:
-      case PROTECTED:
-      case IMPORT:
-      case DECIMAL_LITERAL:
-      case HEX_LITERAL:
-      case OCTAL_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case REGULAR_EXPRESSION:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case LBRACKET:
-      case SEMICOLON:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        Directives();
-        break;
-      default:
-        jj_la1[1] = jj_gen;
-        ;
-      }
-      jj_consume_token(0);
-          jjtree.closeNodeScope(jjtn000, true);
-          jjtc000 = false;
-            _jjtRoot = jjtn000;
-            {if (true) return retval;}
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-    throw new Error("Missing return statement in function");
-  }
-
-/////////////////////////////////////////////////////
-// Expressions 
-/////////////////////////////////////////////////////
-
-/////////////////////////////////////////////////////
-// Identifier 
-/////////////////////////////////////////////////////
-  final public void Identifier() throws ParseException {
- /*@bgen(jjtree) Identifier */
-  ASTIdentifier jjtn000 = new ASTIdentifier(this, JJTIDENTIFIER);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case IDENTIFIER:
-        jj_consume_token(IDENTIFIER);
-        break;
-      case GET:
-        jj_consume_token(GET);
-        break;
-      case SET:
-        jj_consume_token(SET);
-        break;
-      case INCLUDE:
-        jj_consume_token(INCLUDE);
-        break;
-      default:
-        jj_la1[2] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Qualified Identifier 
-/////////////////////////////////////////////////////
-  final public void SimpleQualifiedIdentifier() throws ParseException {
- /*@bgen(jjtree) SimpleQualifiedIdentifier */
-  ASTSimpleQualifiedIdentifier jjtn000 = new ASTSimpleQualifiedIdentifier(this, JJTSIMPLEQUALIFIEDIDENTIFIER);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case GET:
-      case INCLUDE:
-      case SET:
-      case IDENTIFIER:
-        Identifier();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case QUALIFIER:
-          jj_consume_token(QUALIFIER);
-          Identifier();
-          break;
-        default:
-          jj_la1[3] = jj_gen;
-          ;
-        }
-        break;
-      case PRIVATE:
-      case PUBLIC:
-      case PROTECTED:
-        ReservedNamespace();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case QUALIFIER:
-          jj_consume_token(QUALIFIER);
-          Identifier();
-          break;
-        default:
-          jj_la1[4] = jj_gen;
-          ;
-        }
-        break;
-      default:
-        jj_la1[5] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } catch (Throwable jjte000) {
-         if (jjtc000) {
-           jjtree.clearNodeScope(jjtn000);
-           jjtc000 = false;
-         } else {
-           jjtree.popNode();
-         }
-         if (jjte000 instanceof RuntimeException) {
-           {if (true) throw (RuntimeException)jjte000;}
-         }
-         if (jjte000 instanceof ParseException) {
-           {if (true) throw (ParseException)jjte000;}
-         }
-         {if (true) throw (Error)jjte000;}
-    } finally {
-         if (jjtc000) {
-           jjtree.closeNodeScope(jjtn000, true);
-         }
-    }
-  }
-
-  final public void ExpressionQualifiedIdentifier() throws ParseException {
- /*@bgen(jjtree) ExpressionQualifiedIdentifier */
-  ASTExpressionQualifiedIdentifier jjtn000 = new ASTExpressionQualifiedIdentifier(this, JJTEXPRESSIONQUALIFIEDIDENTIFIER);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(LPAREN);
-      AssignmentExpression();
-      jj_consume_token(RPAREN);
-      jj_consume_token(QUALIFIER);
-      Identifier();
-    } catch (Throwable jjte000) {
-         if (jjtc000) {
-           jjtree.clearNodeScope(jjtn000);
-           jjtc000 = false;
-         } else {
-           jjtree.popNode();
-         }
-         if (jjte000 instanceof RuntimeException) {
-           {if (true) throw (RuntimeException)jjte000;}
-         }
-         if (jjte000 instanceof ParseException) {
-           {if (true) throw (ParseException)jjte000;}
-         }
-         {if (true) throw (Error)jjte000;}
-    } finally {
-         if (jjtc000) {
-           jjtree.closeNodeScope(jjtn000, true);
-         }
-    }
-  }
-
-  final public void QualifiedIdentifier() throws ParseException {
- /*@bgen(jjtree) QualifiedIdentifier */
-  ASTQualifiedIdentifier jjtn000 = new ASTQualifiedIdentifier(this, JJTQUALIFIEDIDENTIFIER);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case GET:
-      case INCLUDE:
-      case PRIVATE:
-      case PUBLIC:
-      case SET:
-      case PROTECTED:
-      case IDENTIFIER:
-        SimpleQualifiedIdentifier();
-        break;
-      case LPAREN:
-        ExpressionQualifiedIdentifier();
-        break;
-      default:
-        jj_la1[6] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } catch (Throwable jjte000) {
-         if (jjtc000) {
-           jjtree.clearNodeScope(jjtn000);
-           jjtc000 = false;
-         } else {
-           jjtree.popNode();
-         }
-         if (jjte000 instanceof RuntimeException) {
-           {if (true) throw (RuntimeException)jjte000;}
-         }
-         if (jjte000 instanceof ParseException) {
-           {if (true) throw (ParseException)jjte000;}
-         }
-         {if (true) throw (Error)jjte000;}
-    } finally {
-         if (jjtc000) {
-           jjtree.closeNodeScope(jjtn000, true);
-         }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Primary Expressions
-/////////////////////////////////////////////////////
-  final public void PrimaryExpression() throws ParseException {
- /*@bgen(jjtree) PrimaryExpression */
-  ASTPrimaryExpression jjtn000 = new ASTPrimaryExpression(this, JJTPRIMARYEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case NULL:
-        jj_consume_token(NULL);
-        break;
-      case TRUE:
-        jj_consume_token(TRUE);
-        break;
-      case FALSE:
-        jj_consume_token(FALSE);
-        break;
-      case DECIMAL_LITERAL:
-        jj_consume_token(DECIMAL_LITERAL);
-        break;
-      case OCTAL_LITERAL:
-        jj_consume_token(OCTAL_LITERAL);
-        break;
-      case HEX_LITERAL:
-        jj_consume_token(HEX_LITERAL);
-        break;
-      case FLOATING_POINT_LITERAL:
-        jj_consume_token(FLOATING_POINT_LITERAL);
-        break;
-      case STRING_LITERAL:
-        jj_consume_token(STRING_LITERAL);
-        break;
-      case THIS:
-        jj_consume_token(THIS);
-        break;
-      case REGULAR_EXPRESSION:
-        jj_consume_token(REGULAR_EXPRESSION);
-        break;
-      case LPAREN:
-        jj_consume_token(LPAREN);
-        ListExpression();
-        jj_consume_token(RPAREN);
-        break;
-      case LBRACKET:
-        ArrayLiteral();
-        break;
-      case LBRACE:
-        ObjectLiteral();
-        break;
-      case FUNCTION:
-        FunctionExpression();
-        break;
-      default:
-        jj_la1[7] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-      jjtree.closeNodeScope(jjtn000, true);
-      jjtc000 = false;
-        token_source.setRegValid();
-    } catch (Throwable jjte000) {
-      if (jjtc000) {
-        jjtree.clearNodeScope(jjtn000);
-        jjtc000 = false;
-      } else {
-        jjtree.popNode();
-      }
-      if (jjte000 instanceof RuntimeException) {
-        {if (true) throw (RuntimeException)jjte000;}
-      }
-      if (jjte000 instanceof ParseException) {
-        {if (true) throw (ParseException)jjte000;}
-      }
-      {if (true) throw (Error)jjte000;}
-    } finally {
-      if (jjtc000) {
-        jjtree.closeNodeScope(jjtn000, true);
-      }
-    }
-  }
-
-  final public void ReservedNamespace() throws ParseException {
- /*@bgen(jjtree) ReservedNamespace */
-  ASTReservedNamespace jjtn000 = new ASTReservedNamespace(this, JJTRESERVEDNAMESPACE);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PUBLIC:
-        jj_consume_token(PUBLIC);
-        break;
-      case PROTECTED:
-        jj_consume_token(PROTECTED);
-        break;
-      case PRIVATE:
-        jj_consume_token(PRIVATE);
-        break;
-      default:
-        jj_la1[8] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-         if (jjtc000) {
-           jjtree.closeNodeScope(jjtn000, true);
-         }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Function Expression
-/////////////////////////////////////////////////////
-  final public void FunctionExpression() throws ParseException {
- /*@bgen(jjtree) FunctionExpression */
-  ASTFunctionExpression jjtn000 = new ASTFunctionExpression(this, JJTFUNCTIONEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      if (jj_2_1(2)) {
-        jj_consume_token(FUNCTION);
-        FunctionCommon();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case FUNCTION:
-          jj_consume_token(FUNCTION);
-          Identifier();
-          FunctionCommon();
-          break;
-        default:
-          jj_la1[9] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Object Literals
-/////////////////////////////////////////////////////
-  final public void ObjectLiteral() throws ParseException {
- /*@bgen(jjtree) ObjectLiteral */
-  ASTObjectLiteral jjtn000 = new ASTObjectLiteral(this, JJTOBJECTLITERAL);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(LBRACE);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case GET:
-      case INCLUDE:
-      case PRIVATE:
-      case PUBLIC:
-      case SET:
-      case PROTECTED:
-      case DECIMAL_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-        FieldList();
-        break;
-      default:
-        jj_la1[10] = jj_gen;
-        ;
-      }
-      jj_consume_token(RBRACE);
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void FieldList() throws ParseException {
- /*@bgen(jjtree) FieldList */
-  ASTFieldList jjtn000 = new ASTFieldList(this, JJTFIELDLIST);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      LiteralField();
-      label_2:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[11] = jj_gen;
-          break label_2;
-        }
-        jj_consume_token(COMMA);
-        LiteralField();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void LiteralField() throws ParseException {
- /*@bgen(jjtree) LiteralField */
-  ASTLiteralField jjtn000 = new ASTLiteralField(this, JJTLITERALFIELD);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      FieldName();
-      jj_consume_token(COLON);
-      AssignmentExpression();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void FieldName() throws ParseException {
- /*@bgen(jjtree) FieldName */
-  ASTFieldName jjtn000 = new ASTFieldName(this, JJTFIELDNAME);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case STRING_LITERAL:
-        jj_consume_token(STRING_LITERAL);
-        break;
-      case DECIMAL_LITERAL:
-        jj_consume_token(DECIMAL_LITERAL);
-        break;
-      case GET:
-      case INCLUDE:
-      case PRIVATE:
-      case PUBLIC:
-      case SET:
-      case PROTECTED:
-      case IDENTIFIER:
-        SimpleQualifiedIdentifier();
-        break;
-      case LPAREN:
-        jj_consume_token(LPAREN);
-        AssignmentExpression();
-        jj_consume_token(RPAREN);
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case QUALIFIER:
-          jj_consume_token(QUALIFIER);
-          Identifier();
-          break;
-        default:
-          jj_la1[12] = jj_gen;
-          ;
-        }
-        break;
-      default:
-        jj_la1[13] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Array Literal
-/////////////////////////////////////////////////////
-  final public void ArrayLiteral() throws ParseException {
- /*@bgen(jjtree) ArrayLiteral */
-  ASTArrayLiteral jjtn000 = new ASTArrayLiteral(this, JJTARRAYLITERAL);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(LBRACKET);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case DELETE:
-      case FALSE:
-      case FUNCTION:
-      case GET:
-      case INCLUDE:
-      case NEW:
-      case NULL:
-      case PRIVATE:
-      case PUBLIC:
-      case SET:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case TYPEOF:
-      case VOID:
-      case PROTECTED:
-      case DECIMAL_LITERAL:
-      case HEX_LITERAL:
-      case OCTAL_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case REGULAR_EXPRESSION:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case LBRACKET:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        ElementList();
-        break;
-      default:
-        jj_la1[14] = jj_gen;
-        ;
-      }
-      jj_consume_token(RBRACKET);
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void ElementList() throws ParseException {
- /*@bgen(jjtree) ElementList */
-  ASTElementList jjtn000 = new ASTElementList(this, JJTELEMENTLIST);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      LiteralElement();
-      label_3:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[15] = jj_gen;
-          break label_3;
-        }
-        jj_consume_token(COMMA);
-        LiteralElement();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void LiteralElement() throws ParseException {
- /*@bgen(jjtree) LiteralElement */
-  ASTLiteralElement jjtn000 = new ASTLiteralElement(this, JJTLITERALELEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      AssignmentExpression();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Super Expression
-/////////////////////////////////////////////////////
-  final public void SuperExpression() throws ParseException {
- /*@bgen(jjtree) SuperExpression */
-  ASTSuperExpression jjtn000 = new ASTSuperExpression(this, JJTSUPEREXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(SUPER);
-      if (jj_2_2(2)) {
-        jj_consume_token(LPAREN);
-        AssignmentExpression();
-        jj_consume_token(RPAREN);
-      } else {
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Postfix Expression
-/////////////////////////////////////////////////////
-  final public void PostfixExpression() throws ParseException {
- /*@bgen(jjtree) PostfixExpression */
-  ASTPostfixExpression jjtn000 = new ASTPostfixExpression(this, JJTPOSTFIXEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case GET:
-      case INCLUDE:
-      case PRIVATE:
-      case PUBLIC:
-      case SET:
-      case PROTECTED:
-      case IDENTIFIER:
-        AttributeExpression();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case INCR:
-        case DECR:
-          PostfixOp();
-          break;
-        default:
-          jj_la1[16] = jj_gen;
-          ;
-        }
-        break;
-      case FALSE:
-      case FUNCTION:
-      case NEW:
-      case NULL:
-      case THIS:
-      case TRUE:
-      case DECIMAL_LITERAL:
-      case HEX_LITERAL:
-      case OCTAL_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case REGULAR_EXPRESSION:
-      case LPAREN:
-      case LBRACE:
-      case LBRACKET:
-         token_source.setRegInvalid();
-        FullPostfixExpression();
-        label_4:
-        while (true) {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case LPAREN:
-          case LBRACKET:
-          case DOT:
-            ;
-            break;
-          default:
-            jj_la1[17] = jj_gen;
-            break label_4;
-          }
-          PropertyOrArguments();
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case INCR:
-        case DECR:
-          PostfixOp();
-          break;
-        default:
-          jj_la1[18] = jj_gen;
-          ;
-        }
-        break;
-      case SUPER:
-        SuperExpression();
-        PropertyOperator();
-        break;
-      default:
-        jj_la1[19] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void AttributeExpression() throws ParseException {
- /*@bgen(jjtree) AttributeExpression */
-  ASTAttributeExpression jjtn000 = new ASTAttributeExpression(this, JJTATTRIBUTEEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      SimpleQualifiedIdentifier();
-      label_5:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LPAREN:
-        case LBRACKET:
-        case DOT:
-          ;
-          break;
-        default:
-          jj_la1[20] = jj_gen;
-          break label_5;
-        }
-        PropertyOrArguments();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void FullPostfixExpression() throws ParseException {
- /*@bgen(jjtree) FullPostfixExpression */
-  ASTFullPostfixExpression jjtn000 = new ASTFullPostfixExpression(this, JJTFULLPOSTFIXEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      if (jj_2_3(2147483647)) {
-        ExpressionQualifiedIdentifier();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case FALSE:
-        case FUNCTION:
-        case NULL:
-        case THIS:
-        case TRUE:
-        case DECIMAL_LITERAL:
-        case HEX_LITERAL:
-        case OCTAL_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case STRING_LITERAL:
-        case REGULAR_EXPRESSION:
-        case LPAREN:
-        case LBRACE:
-        case LBRACKET:
-          PrimaryExpression();
-          break;
-        case NEW:
-          FullNewExpression();
-          break;
-        default:
-          jj_la1[21] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } catch (Throwable jjte000) {
-         if (jjtc000) {
-           jjtree.clearNodeScope(jjtn000);
-           jjtc000 = false;
-         } else {
-           jjtree.popNode();
-         }
-         if (jjte000 instanceof RuntimeException) {
-           {if (true) throw (RuntimeException)jjte000;}
-         }
-         if (jjte000 instanceof ParseException) {
-           {if (true) throw (ParseException)jjte000;}
-         }
-         {if (true) throw (Error)jjte000;}
-    } finally {
-         if (jjtc000) {
-           jjtree.closeNodeScope(jjtn000, true);
-         }
-    }
-  }
-
-  final public void FullNewExpression() throws ParseException {
- /*@bgen(jjtree) FullNewExpression */
-  ASTFullNewExpression jjtn000 = new ASTFullNewExpression(this, JJTFULLNEWEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(NEW);
-      FullNewSubexpression();
-      label_6:
-      while (true) {
-        if (jj_2_4(2)) {
-          ;
-        } else {
-          break label_6;
-        }
-        PropertyOperator();
-      }
-      if (jj_2_5(2)) {
-        Arguments();
-      } else {
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void FunctionConstructor() throws ParseException {
- /*@bgen(jjtree) FunctionConstructor */
-  ASTFunctionConstructor jjtn000 = new ASTFunctionConstructor(this, JJTFUNCTIONCONSTRUCTOR);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(FUNCTION_);
-      Arguments();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void FullNewSubexpression() throws ParseException {
- /*@bgen(jjtree) FullNewSubexpression */
-  ASTFullNewSubexpression jjtn000 = new ASTFullNewSubexpression(this, JJTFULLNEWSUBEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      if (jj_2_6(2147483647)) {
-        ExpressionQualifiedIdentifier();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case FALSE:
-        case FUNCTION:
-        case NULL:
-        case THIS:
-        case TRUE:
-        case DECIMAL_LITERAL:
-        case HEX_LITERAL:
-        case OCTAL_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case STRING_LITERAL:
-        case REGULAR_EXPRESSION:
-        case LPAREN:
-        case LBRACE:
-        case LBRACKET:
-          PrimaryExpression();
-          break;
-        case GET:
-        case INCLUDE:
-        case PRIVATE:
-        case PUBLIC:
-        case SET:
-        case PROTECTED:
-        case IDENTIFIER:
-          SimpleQualifiedIdentifier();
-          break;
-        case SUPER:
-          SuperExpression();
-          break;
-        case NEW:
-          FullNewExpression();
-          break;
-        case FUNCTION_:
-          FunctionConstructor();
-          break;
-        default:
-          jj_la1[22] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void PostfixOp() throws ParseException {
- /*@bgen(jjtree) PostfixOp */
-  ASTPostfixOp jjtn000 = new ASTPostfixOp(this, JJTPOSTFIXOP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case INCR:
-        jj_consume_token(INCR);
-        break;
-      case DECR:
-        jj_consume_token(DECR);
-        break;
-      default:
-        jj_la1[23] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void PropertyOrArguments() throws ParseException {
- /*@bgen(jjtree) PropertyOrArguments */
-  ASTPropertyOrArguments jjtn000 = new ASTPropertyOrArguments(this, JJTPROPERTYORARGUMENTS);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LPAREN:
-        Arguments();
-        break;
-      case LBRACKET:
-      case DOT:
-        PropertyOperator();
-        break;
-      default:
-        jj_la1[24] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Property Operators
-/////////////////////////////////////////////////////
-  final public void PropertyOperator() throws ParseException {
- /*@bgen(jjtree) PropertyOperator */
-  ASTPropertyOperator jjtn000 = new ASTPropertyOperator(this, JJTPROPERTYOPERATOR);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case DOT:
-        jj_consume_token(DOT);
-        QualifiedIdentifier();
-        break;
-      default:
-        jj_la1[26] = jj_gen;
-        if (jj_2_7(2)) {
-          jj_consume_token(LBRACKET);
-          jj_consume_token(RBRACKET);
-        } else if (jj_2_8(2)) {
-          jj_consume_token(LBRACKET);
-          jj_consume_token(ELIPSE);
-          AssignmentExpression();
-          jj_consume_token(RBRACKET);
-        } else {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case LBRACKET:
-            jj_consume_token(LBRACKET);
-            ListExpression();
-            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-            case ELIPSE:
-              jj_consume_token(ELIPSE);
-              AssignmentExpression();
-              break;
-            default:
-              jj_la1[25] = jj_gen;
-              ;
-            }
-            jj_consume_token(RBRACKET);
-            break;
-          default:
-            jj_la1[27] = jj_gen;
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-        }
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void Arguments() throws ParseException {
- /*@bgen(jjtree) Arguments */
- ASTArguments jjtn000 = new ASTArguments(this, JJTARGUMENTS);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);{token_source.setRegValid();}
-    try {
-      if (jj_2_9(2)) {
-        jj_consume_token(LPAREN);
-        jj_consume_token(RPAREN);
-      } else if (jj_2_10(2)) {
-        jj_consume_token(LPAREN);
-        jj_consume_token(ELIPSE);
-        AssignmentExpression();
-        jj_consume_token(RPAREN);
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LPAREN:
-          jj_consume_token(LPAREN);
-          ListExpression();
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case ELIPSE:
-            jj_consume_token(ELIPSE);
-            AssignmentExpression();
-            break;
-          default:
-            jj_la1[28] = jj_gen;
-            ;
-          }
-          jj_consume_token(RPAREN);
-          break;
-        default:
-          jj_la1[29] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Unary Operators 
-/////////////////////////////////////////////////////
-  final public void UnaryExpression() throws ParseException {
- /*@bgen(jjtree) UnaryExpression */
-  ASTUnaryExpression jjtn000 = new ASTUnaryExpression(this, JJTUNARYEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case FALSE:
-      case FUNCTION:
-      case GET:
-      case INCLUDE:
-      case NEW:
-      case NULL:
-      case PRIVATE:
-      case PUBLIC:
-      case SET:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case PROTECTED:
-      case DECIMAL_LITERAL:
-      case HEX_LITERAL:
-      case OCTAL_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case REGULAR_EXPRESSION:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case LBRACKET:
-        PostfixExpression();
-        break;
-      case DELETE:
-        jj_consume_token(DELETE);
-        PostfixExpression();
-        break;
-      case VOID:
-        jj_consume_token(VOID);
-        UnaryExpression();
-        break;
-      case TYPEOF:
-        jj_consume_token(TYPEOF);
-        UnaryExpression();
-        break;
-      case INCR:
-        jj_consume_token(INCR);
-        PostfixExpression();
-        break;
-      case DECR:
-        jj_consume_token(DECR);
-        PostfixExpression();
-        break;
-      case PLUS:
-        jj_consume_token(PLUS);
-        UnaryExpression();
-        break;
-      case MINUS:
-        jj_consume_token(MINUS);
-        UnaryExpression();
-        break;
-      case TILDE:
-        jj_consume_token(TILDE);
-        UnaryExpression();
-        break;
-      case BANG:
-        jj_consume_token(BANG);
-        UnaryExpression();
-        break;
-      default:
-        jj_la1[30] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } catch (Throwable jjte000) {
-                   if (jjtc000) {
-                     jjtree.clearNodeScope(jjtn000);
-                     jjtc000 = false;
-                   } else {
-                     jjtree.popNode();
-                   }
-                   if (jjte000 instanceof RuntimeException) {
-                     {if (true) throw (RuntimeException)jjte000;}
-                   }
-                   if (jjte000 instanceof ParseException) {
-                     {if (true) throw (ParseException)jjte000;}
-                   }
-                   {if (true) throw (Error)jjte000;}
-    } finally {
-                   if (jjtc000) {
-                     jjtree.closeNodeScope(jjtn000, true);
-                   }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Multiplicative Operators 
-/////////////////////////////////////////////////////
-  final public void MulOp() throws ParseException {
- /*@bgen(jjtree) MulOp */
-  ASTMulOp jjtn000 = new ASTMulOp(this, JJTMULOP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case STAR:
-        jj_consume_token(STAR);
-        break;
-      case SLASH:
-        jj_consume_token(SLASH);
-        break;
-      case REM:
-        jj_consume_token(REM);
-        break;
-      default:
-        jj_la1[31] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void MultiplicativeExpression() throws ParseException {
- /*@bgen(jjtree) MultiplicativeExpression */
-  ASTMultiplicativeExpression jjtn000 = new ASTMultiplicativeExpression(this, JJTMULTIPLICATIVEEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      UnaryExpression();
-      label_7:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case STAR:
-        case SLASH:
-        case REM:
-          ;
-          break;
-        default:
-          jj_la1[32] = jj_gen;
-          break label_7;
-        }
-        MulOp();
-        UnaryExpression();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Additive Operators 
-/////////////////////////////////////////////////////
-  final public void AddOp() throws ParseException {
- /*@bgen(jjtree) AddOp */
-  ASTAddOp jjtn000 = new ASTAddOp(this, JJTADDOP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case PLUS:
-        jj_consume_token(PLUS);
-        break;
-      case MINUS:
-        jj_consume_token(MINUS);
-        break;
-      default:
-        jj_la1[33] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void AdditiveExpression() throws ParseException {
- /*@bgen(jjtree) AdditiveExpression */
-  ASTAdditiveExpression jjtn000 = new ASTAdditiveExpression(this, JJTADDITIVEEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      MultiplicativeExpression();
-      label_8:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case PLUS:
-        case MINUS:
-          ;
-          break;
-        default:
-          jj_la1[34] = jj_gen;
-          break label_8;
-        }
-        AddOp();
-        MultiplicativeExpression();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Bitwise Shift Operators 
-/////////////////////////////////////////////////////
-  final public void ShiftOp() throws ParseException {
- /*@bgen(jjtree) ShiftOp */
-  ASTShiftOp jjtn000 = new ASTShiftOp(this, JJTSHIFTOP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LSHIFT:
-        jj_consume_token(LSHIFT);
-        break;
-      case RSIGNEDSHIFT:
-        jj_consume_token(RSIGNEDSHIFT);
-        break;
-      case RUNSIGNEDSHIFT:
-        jj_consume_token(RUNSIGNEDSHIFT);
-        break;
-      default:
-        jj_la1[35] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void ShiftExpression() throws ParseException {
- /*@bgen(jjtree) ShiftExpression */
-  ASTShiftExpression jjtn000 = new ASTShiftExpression(this, JJTSHIFTEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      AdditiveExpression();
-      label_9:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case LSHIFT:
-        case RSIGNEDSHIFT:
-        case RUNSIGNEDSHIFT:
-          ;
-          break;
-        default:
-          jj_la1[36] = jj_gen;
-          break label_9;
-        }
-        ShiftOp();
-        AdditiveExpression();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Relational Operators 
-/////////////////////////////////////////////////////
-  final public void RelOp() throws ParseException {
- /*@bgen(jjtree) RelOp */
-  ASTRelOp jjtn000 = new ASTRelOp(this, JJTRELOP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LT:
-        jj_consume_token(LT);
-        break;
-      case GT:
-        jj_consume_token(GT);
-        break;
-      case LE:
-        jj_consume_token(LE);
-        break;
-      case GE:
-        jj_consume_token(GE);
-        break;
-      case IS:
-        jj_consume_token(IS);
-        break;
-      case AS:
-        jj_consume_token(AS);
-        break;
-      default:
-        jj_la1[37] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void RelationalExpression() throws ParseException {
- /*@bgen(jjtree) RelationalExpression */
-  ASTRelationalExpression jjtn000 = new ASTRelationalExpression(this, JJTRELATIONALEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      ShiftExpression();
-      label_10:
-      while (true) {
-        if (jj_2_11(3)) {
-          ;
-        } else {
-          break label_10;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AS:
-        case IS:
-        case GT:
-        case LT:
-        case LE:
-        case GE:
-          RelOp();
-          break;
-        case IN:
-          jj_consume_token(IN);
-          break;
-        case INSTANCEOF:
-          jj_consume_token(INSTANCEOF);
-          break;
-        default:
-          jj_la1[38] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        ShiftExpression();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void RelationalExpressionNoIN() throws ParseException {
- /*@bgen(jjtree) RelationalExpressionNoIN */
-  ASTRelationalExpressionNoIN jjtn000 = new ASTRelationalExpressionNoIN(this, JJTRELATIONALEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      ShiftExpression();
-      label_11:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AS:
-        case INSTANCEOF:
-        case IS:
-        case GT:
-        case LT:
-        case LE:
-        case GE:
-          ;
-          break;
-        default:
-          jj_la1[39] = jj_gen;
-          break label_11;
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AS:
-        case IS:
-        case GT:
-        case LT:
-        case LE:
-        case GE:
-          RelOp();
-          break;
-        case INSTANCEOF:
-          jj_consume_token(INSTANCEOF);
-          break;
-        default:
-          jj_la1[40] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-        ShiftExpression();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Equality Operators 
-/////////////////////////////////////////////////////
-  final public void EqualOp() throws ParseException {
- /*@bgen(jjtree) EqualOp */
-  ASTEqualOp jjtn000 = new ASTEqualOp(this, JJTEQUALOP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EQ:
-        jj_consume_token(EQ);
-        break;
-      case NE:
-        jj_consume_token(NE);
-        break;
-      case IDENTITYOPER:
-        jj_consume_token(IDENTITYOPER);
-        break;
-      case NOTIDENTITYOPER:
-        jj_consume_token(NOTIDENTITYOPER);
-        break;
-      default:
-        jj_la1[41] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void EqualityExpression() throws ParseException {
- /*@bgen(jjtree) EqualityExpression */
-  ASTEqualityExpression jjtn000 = new ASTEqualityExpression(this, JJTEQUALITYEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      RelationalExpression();
-      label_12:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case EQ:
-        case NE:
-        case IDENTITYOPER:
-        case NOTIDENTITYOPER:
-          ;
-          break;
-        default:
-          jj_la1[42] = jj_gen;
-          break label_12;
-        }
-        EqualOp();
-        RelationalExpression();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void EqualityExpressionNoIN() throws ParseException {
- /*@bgen(jjtree) EqualityExpressionNoIN */
-  ASTEqualityExpressionNoIN jjtn000 = new ASTEqualityExpressionNoIN(this, JJTEQUALITYEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      RelationalExpressionNoIN();
-      label_13:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case EQ:
-        case NE:
-        case IDENTITYOPER:
-        case NOTIDENTITYOPER:
-          ;
-          break;
-        default:
-          jj_la1[43] = jj_gen;
-          break label_13;
-        }
-        EqualOp();
-        RelationalExpressionNoIN();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Binary Bitwise Operators 
-/////////////////////////////////////////////////////
-  final public void BitwiseANDOp() throws ParseException {
- /*@bgen(jjtree) BitwiseANDOp */
-  ASTBitwiseANDOp jjtn000 = new ASTBitwiseANDOp(this, JJTBITWISEANDOP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(BIT_AND);
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void BitwiseANDExpression() throws ParseException {
- /*@bgen(jjtree) BitwiseANDExpression */
-  ASTBitwiseANDExpression jjtn000 = new ASTBitwiseANDExpression(this, JJTBITWISEANDEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      EqualityExpression();
-      label_14:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BIT_AND:
-          ;
-          break;
-        default:
-          jj_la1[44] = jj_gen;
-          break label_14;
-        }
-        BitwiseANDOp();
-        EqualityExpression();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void BitwiseANDExpressionNoIN() throws ParseException {
- /*@bgen(jjtree) BitwiseANDExpressionNoIN */
-  ASTBitwiseANDExpressionNoIN jjtn000 = new ASTBitwiseANDExpressionNoIN(this, JJTBITWISEANDEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      EqualityExpressionNoIN();
-      label_15:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BIT_AND:
-          ;
-          break;
-        default:
-          jj_la1[45] = jj_gen;
-          break label_15;
-        }
-        BitwiseANDOp();
-        EqualityExpressionNoIN();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void BitwiseXOROp() throws ParseException {
- /*@bgen(jjtree) BitwiseXOROp */
-  ASTBitwiseXOROp jjtn000 = new ASTBitwiseXOROp(this, JJTBITWISEXOROP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(XOR);
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void BitwiseXORExpression() throws ParseException {
- /*@bgen(jjtree) BitwiseXORExpression */
-  ASTBitwiseXORExpression jjtn000 = new ASTBitwiseXORExpression(this, JJTBITWISEXOREXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      BitwiseANDExpression();
-      label_16:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case XOR:
-          ;
-          break;
-        default:
-          jj_la1[46] = jj_gen;
-          break label_16;
-        }
-        BitwiseXOROp();
-        BitwiseANDExpression();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void BitwiseXORExpressionNoIN() throws ParseException {
- /*@bgen(jjtree) BitwiseXORExpressionNoIN */
-  ASTBitwiseXORExpressionNoIN jjtn000 = new ASTBitwiseXORExpressionNoIN(this, JJTBITWISEXOREXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      BitwiseANDExpressionNoIN();
-      label_17:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case XOR:
-          ;
-          break;
-        default:
-          jj_la1[47] = jj_gen;
-          break label_17;
-        }
-        BitwiseXOROp();
-        BitwiseANDExpressionNoIN();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void BitwiseOROp() throws ParseException {
- /*@bgen(jjtree) BitwiseOROp */
-  ASTBitwiseOROp jjtn000 = new ASTBitwiseOROp(this, JJTBITWISEOROP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(BIT_OR);
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void BitwiseORExpression() throws ParseException {
- /*@bgen(jjtree) BitwiseORExpression */
-  ASTBitwiseORExpression jjtn000 = new ASTBitwiseORExpression(this, JJTBITWISEOREXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      BitwiseXORExpression();
-      label_18:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BIT_OR:
-          ;
-          break;
-        default:
-          jj_la1[48] = jj_gen;
-          break label_18;
-        }
-        BitwiseOROp();
-        BitwiseXORExpression();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void BitwiseORExpressionNoIN() throws ParseException {
- /*@bgen(jjtree) BitwiseORExpressionNoIN */
-  ASTBitwiseORExpressionNoIN jjtn000 = new ASTBitwiseORExpressionNoIN(this, JJTBITWISEOREXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      BitwiseXORExpressionNoIN();
-      label_19:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BIT_OR:
-          ;
-          break;
-        default:
-          jj_la1[49] = jj_gen;
-          break label_19;
-        }
-        BitwiseOROp();
-        BitwiseXORExpressionNoIN();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Binary Logical Operators 
-/////////////////////////////////////////////////////
-  final public void LogicalANDExpression() throws ParseException {
- /*@bgen(jjtree) LogicalANDExpression */
-  ASTLogicalANDExpression jjtn000 = new ASTLogicalANDExpression(this, JJTLOGICALANDEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      BitwiseORExpression();
-      label_20:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case SC_AND:
-          ;
-          break;
-        default:
-          jj_la1[50] = jj_gen;
-          break label_20;
-        }
-        jj_consume_token(SC_AND);
-        BitwiseORExpression();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void LogicalANDExpressionNoIN() throws ParseException {
- /*@bgen(jjtree) LogicalANDExpressionNoIN */
-  ASTLogicalANDExpressionNoIN jjtn000 = new ASTLogicalANDExpressionNoIN(this, JJTLOGICALANDEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      BitwiseORExpressionNoIN();
-      label_21:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case SC_AND:
-          ;
-          break;
-        default:
-          jj_la1[51] = jj_gen;
-          break label_21;
-        }
-        jj_consume_token(SC_AND);
-        BitwiseORExpressionNoIN();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void LogicalORExpression() throws ParseException {
- /*@bgen(jjtree) LogicalORExpression */
-  ASTLogicalORExpression jjtn000 = new ASTLogicalORExpression(this, JJTLOGICALOREXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      LogicalANDExpression();
-      label_22:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case SC_OR:
-          ;
-          break;
-        default:
-          jj_la1[52] = jj_gen;
-          break label_22;
-        }
-        jj_consume_token(SC_OR);
-        LogicalANDExpression();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void LogicalORExpressionNoIN() throws ParseException {
- /*@bgen(jjtree) LogicalORExpressionNoIN */
-  ASTLogicalORExpressionNoIN jjtn000 = new ASTLogicalORExpressionNoIN(this, JJTLOGICALOREXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      LogicalANDExpressionNoIN();
-      label_23:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case SC_OR:
-          ;
-          break;
-        default:
-          jj_la1[53] = jj_gen;
-          break label_23;
-        }
-        jj_consume_token(SC_OR);
-        LogicalANDExpressionNoIN();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Conditional Operators 
-/////////////////////////////////////////////////////
-  final public void ConditionalExpression() throws ParseException {
- /*@bgen(jjtree) ConditionalExpression */
-  ASTConditionalExpression jjtn000 = new ASTConditionalExpression(this, JJTCONDITIONALEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      LogicalORExpression();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case HOOK:
-        jj_consume_token(HOOK);
-        AssignmentExpression();
-        jj_consume_token(COLON);
-        AssignmentExpression();
-        break;
-      default:
-        jj_la1[54] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void ConditionalExpressionNoIN() throws ParseException {
- /*@bgen(jjtree) ConditionalExpressionNoIN */
-  ASTConditionalExpressionNoIN jjtn000 = new ASTConditionalExpressionNoIN(this, JJTCONDITIONALEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      LogicalORExpressionNoIN();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case HOOK:
-        jj_consume_token(HOOK);
-        AssignmentExpressionNoIN();
-        jj_consume_token(COLON);
-        AssignmentExpressionNoIN();
-        break;
-      default:
-        jj_la1[55] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void NonAssignmentExpression() throws ParseException {
- /*@bgen(jjtree) NonAssignmentExpression */
-  ASTNonAssignmentExpression jjtn000 = new ASTNonAssignmentExpression(this, JJTNONASSIGNMENTEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      LogicalORExpression();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case HOOK:
-        jj_consume_token(HOOK);
-        NonAssignmentExpression();
-        jj_consume_token(COLON);
-        NonAssignmentExpression();
-        break;
-      default:
-        jj_la1[56] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void NonAssignmentExpressionNoIN() throws ParseException {
- /*@bgen(jjtree) NonAssignmentExpressionNoIN */
-  ASTNonAssignmentExpressionNoIN jjtn000 = new ASTNonAssignmentExpressionNoIN(this, JJTNONASSIGNMENTEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      LogicalORExpressionNoIN();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case HOOK:
-        jj_consume_token(HOOK);
-        NonAssignmentExpressionNoIN();
-        jj_consume_token(COLON);
-        NonAssignmentExpressionNoIN();
-        break;
-      default:
-        jj_la1[57] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Assignment Operators 
-/////////////////////////////////////////////////////
-  final public void AssignementOperator() throws ParseException {
- /*@bgen(jjtree) AssignementOperator */
-  ASTAssignementOperator jjtn000 = new ASTAssignementOperator(this, JJTASSIGNEMENTOPERATOR);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSIGN:
-        jj_consume_token(ASSIGN);
-        break;
-      case STARASSIGN:
-        jj_consume_token(STARASSIGN);
-        break;
-      case SLASHASSIGN:
-        jj_consume_token(SLASHASSIGN);
-        break;
-      case REMASSIGN:
-        jj_consume_token(REMASSIGN);
-        break;
-      case PLUSASSIGN:
-        jj_consume_token(PLUSASSIGN);
-        break;
-      case MINUSASSIGN:
-        jj_consume_token(MINUSASSIGN);
-        break;
-      case LSHIFTASSIGN:
-        jj_consume_token(LSHIFTASSIGN);
-        break;
-      case RSIGNEDSHIFTASSIGN:
-        jj_consume_token(RSIGNEDSHIFTASSIGN);
-        break;
-      case RUNSIGNEDSHIFTASSIGN:
-        jj_consume_token(RUNSIGNEDSHIFTASSIGN);
-        break;
-      case ANDASSIGN:
-        jj_consume_token(ANDASSIGN);
-        break;
-      case XORASSIGN:
-        jj_consume_token(XORASSIGN);
-        break;
-      case ORASSIGN:
-        jj_consume_token(ORASSIGN);
-        break;
-      case SC_ANDASSIGN:
-        jj_consume_token(SC_ANDASSIGN);
-        break;
-      case SC_XORASSIGN:
-        jj_consume_token(SC_XORASSIGN);
-        break;
-      case SC_ORASSIGN:
-        jj_consume_token(SC_ORASSIGN);
-        break;
-      default:
-        jj_la1[58] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void AssignmentExpression() throws ParseException {
- /*@bgen(jjtree) AssignmentExpression */
-  ASTAssignmentExpression jjtn000 = new ASTAssignmentExpression(this, JJTASSIGNMENTEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      ConditionalExpression();
-      if (jj_2_12(2)) {
-        AssignementOperator();
-        AssignmentExpression();
-      } else {
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void AssignmentExpressionNoIN() throws ParseException {
- /*@bgen(jjtree) AssignmentExpressionNoIN */
-  ASTAssignmentExpressionNoIN jjtn000 = new ASTAssignmentExpressionNoIN(this, JJTASSIGNMENTEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      ConditionalExpressionNoIN();
-      if (jj_2_13(2)) {
-        AssignementOperator();
-        AssignmentExpressionNoIN();
-      } else {
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Comma Expressions
-/////////////////////////////////////////////////////
-  final public void ListExpression() throws ParseException {
- /*@bgen(jjtree) ListExpression */
-  ASTListExpression jjtn000 = new ASTListExpression(this, JJTLISTEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      AssignmentExpression();
-      label_24:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[59] = jj_gen;
-          break label_24;
-        }
-        jj_consume_token(COMMA);
-        AssignmentExpression();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void ListExpressionNoIN() throws ParseException {
- /*@bgen(jjtree) ListExpressionNoIN */
-  ASTListExpressionNoIN jjtn000 = new ASTListExpressionNoIN(this, JJTLISTEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      AssignmentExpressionNoIN();
-      label_25:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[60] = jj_gen;
-          break label_25;
-        }
-        jj_consume_token(COMMA);
-        AssignmentExpressionNoIN();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Type Expressions
-/////////////////////////////////////////////////////
-  final public void TypeExpression() throws ParseException {
- /*@bgen(jjtree) TypeExpression */
-  ASTTypeExpression jjtn000 = new ASTTypeExpression(this, JJTTYPEEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      NonAssignmentExpression();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void TypeExpressionNoIN() throws ParseException {
- /*@bgen(jjtree) TypeExpressionNoIN */
-  ASTTypeExpressionNoIN jjtn000 = new ASTTypeExpressionNoIN(this, JJTTYPEEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      NonAssignmentExpressionNoIN();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void TypeExpressionList() throws ParseException {
- /*@bgen(jjtree) TypeExpressionList */
-  ASTTypeExpressionList jjtn000 = new ASTTypeExpressionList(this, JJTTYPEEXPRESSIONLIST);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      NonAssignmentExpression();
-      label_26:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[61] = jj_gen;
-          break label_26;
-        }
-        jj_consume_token(COMMA);
-        NonAssignmentExpression();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Staements (abbrev, noShortIf, full) 
-/////////////////////////////////////////////////////
-  final public void Statement() throws ParseException {
- /*@bgen(jjtree) Statement */
-  ASTStatement jjtn000 = new ASTStatement(this, JJTSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      if (jj_2_14(3)) {
-        ExpressionStatement();
-        Sc();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case SUPER:
-          SuperStatement();
-          Sc();
-          break;
-        case LBRACE:
-          Block();
-          break;
-        case GET:
-        case INCLUDE:
-        case SET:
-        case IDENTIFIER:
-          LabeledStatement();
-          break;
-        case IF:
-          IfStatement();
-          break;
-        case SWITCH:
-          SwitchStatement();
-          break;
-        case DO:
-          DoStatement();
-          Sc();
-          break;
-        case WHILE:
-          WhileStatement();
-          break;
-        case FOR:
-          ForStatement();
-          break;
-        case WITH:
-          WithStatement();
-          break;
-        case CONTINUE:
-          ContinueStatement();
-          Sc();
-          break;
-        case BREAK:
-          BreakStatement();
-          Sc();
-          break;
-        case RETURN:
-          ReturnStatement();
-          Sc();
-          break;
-        case THROW:
-          ThrowStatement();
-          Sc();
-          break;
-        case TRY:
-          TryStatement();
-          break;
-        default:
-          jj_la1[62] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void Substatement() throws ParseException {
- /*@bgen(jjtree) Substatement */
-  ASTSubstatement jjtn000 = new ASTSubstatement(this, JJTSUBSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case SEMICOLON:
-        EmptyStatement();
-        break;
-      default:
-        jj_la1[63] = jj_gen;
-        if (jj_2_15(2)) {
-          Statement();
-        } else {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case VAR:
-            SimpleVariableDefinition();
-            Sc();
-            break;
-          case FALSE:
-          case GET:
-          case INCLUDE:
-          case PRIVATE:
-          case PUBLIC:
-          case SET:
-          case TRUE:
-          case PROTECTED:
-          case IDENTIFIER:
-            Attributes();
-            jj_consume_token(LBRACE);
-            Substatements();
-            jj_consume_token(RBRACE);
-            break;
-          default:
-            jj_la1[64] = jj_gen;
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-        }
-      }
-    } catch (Throwable jjte000) {
-                       if (jjtc000) {
-                         jjtree.clearNodeScope(jjtn000);
-                         jjtc000 = false;
-                       } else {
-                         jjtree.popNode();
-                       }
-                       if (jjte000 instanceof RuntimeException) {
-                         {if (true) throw (RuntimeException)jjte000;}
-                       }
-                       if (jjte000 instanceof ParseException) {
-                         {if (true) throw (ParseException)jjte000;}
-                       }
-                       {if (true) throw (Error)jjte000;}
-    } finally {
-                       if (jjtc000) {
-                         jjtree.closeNodeScope(jjtn000, true);
-                       }
-    }
-  }
-
-  final public void Substatements() throws ParseException {
- /*@bgen(jjtree) Substatements */
-  ASTSubstatements jjtn000 = new ASTSubstatements(this, JJTSUBSTATEMENTS);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      label_27:
-      while (true) {
-        Substatement();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BREAK:
-        case CONTINUE:
-        case DELETE:
-        case DO:
-        case FALSE:
-        case FOR:
-        case FUNCTION:
-        case GET:
-        case IF:
-        case INCLUDE:
-        case NEW:
-        case NULL:
-        case PRIVATE:
-        case PUBLIC:
-        case RETURN:
-        case SET:
-        case SUPER:
-        case SWITCH:
-        case THIS:
-        case THROW:
-        case TRUE:
-        case TRY:
-        case TYPEOF:
-        case VAR:
-        case VOID:
-        case WHILE:
-        case WITH:
-        case PROTECTED:
-        case DECIMAL_LITERAL:
-        case HEX_LITERAL:
-        case OCTAL_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case STRING_LITERAL:
-        case REGULAR_EXPRESSION:
-        case IDENTIFIER:
-        case LPAREN:
-        case LBRACE:
-        case LBRACKET:
-        case SEMICOLON:
-        case BANG:
-        case TILDE:
-        case INCR:
-        case DECR:
-        case PLUS:
-        case MINUS:
-          ;
-          break;
-        default:
-          jj_la1[65] = jj_gen;
-          break label_27;
-        }
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  void Sc() throws ParseException {
-             /*@bgen(jjtree) Sc */
- ASTSc jjtn000 = new ASTSc(this, JJTSC);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- try {Token tok = getToken(1);
-    if (tok.kind == SEMICOLON) {
-       tok = getNextToken();
-    } else if (tok.specialToken != null) {
-       if (!EolCommentSkipWs(tok.specialToken) && (tok.kind != EOF)) {
-          throw generateParseException();
-       }
-    } else if ((tok.kind != EOF) && (tok.kind!=RBRACE)) {
-         throw generateParseException();
-    }/*@bgen(jjtree)*/
- } finally {
-   if (jjtc000) {
-     jjtree.closeNodeScope(jjtn000, true);
-   }
- }
-  }
-
-  boolean EolCommentSkipWs(Token t) throws ParseException {
-                                     /*@bgen(jjtree) EolCommentSkipWs */
- ASTEolCommentSkipWs jjtn000 = new ASTEolCommentSkipWs(this, JJTEOLCOMMENTSKIPWS);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- try {boolean retVal = false;
-    Token specialToken = t;
-    while(specialToken != null) {
-      if(specialToken.kind == WS) {
-        specialToken = specialToken.specialToken;
-        continue;
-      }
-      else if(specialToken.kind == EOL  ||
-              specialToken.kind == SINGLE_LINE_COMMENT) {
-        retVal = true;
-        break;
-      }
-      else {
-        break;
-      }
-    }
-    return retVal;/*@bgen(jjtree)*/
- } finally {
-   if (jjtc000) {
-     jjtree.closeNodeScope(jjtn000, true);
-   }
- }
-  }
-
-/////////////////////////////////////////////////////
-// Empty Statement 
-/////////////////////////////////////////////////////
-  final public void EmptyStatement() throws ParseException {
- /*@bgen(jjtree) EmptyStatement */
-  ASTEmptyStatement jjtn000 = new ASTEmptyStatement(this, JJTEMPTYSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(SEMICOLON);
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Expresion Statement 
-/////////////////////////////////////////////////////
-  final public void ExpressionStatement() throws ParseException {
- /*@bgen(jjtree) ExpressionStatement */
-  ASTExpressionStatement jjtn000 = new ASTExpressionStatement(this, JJTEXPRESSIONSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      ListExpression();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Super Statement 
-/////////////////////////////////////////////////////
-  final public void SuperStatement() throws ParseException {
- /*@bgen(jjtree) SuperStatement */
-  ASTSuperStatement jjtn000 = new ASTSuperStatement(this, JJTSUPERSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(SUPER);
-      Arguments();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Block Statement 
-/////////////////////////////////////////////////////
-  final public void Block() throws ParseException {
- /*@bgen(jjtree) Block */
-  ASTBlock jjtn000 = new ASTBlock(this, JJTBLOCK);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(LBRACE);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BREAK:
-      case CLASS:
-      case CONST:
-      case CONTINUE:
-      case DELETE:
-      case DO:
-      case FALSE:
-      case FOR:
-      case FUNCTION:
-      case GET:
-      case IF:
-      case INCLUDE:
-      case NAMESPACE:
-      case NEW:
-      case NULL:
-      case PRIVATE:
-      case PUBLIC:
-      case RETURN:
-      case SET:
-      case SUPER:
-      case SWITCH:
-      case THIS:
-      case THROW:
-      case TRUE:
-      case TRY:
-      case TYPEOF:
-      case USE:
-      case VAR:
-      case VOID:
-      case WHILE:
-      case WITH:
-      case EXPORT:
-      case INTERFACE:
-      case PROTECTED:
-      case IMPORT:
-      case DECIMAL_LITERAL:
-      case HEX_LITERAL:
-      case OCTAL_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case REGULAR_EXPRESSION:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case LBRACKET:
-      case SEMICOLON:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        Directives();
-        break;
-      default:
-        jj_la1[66] = jj_gen;
-        ;
-      }
-      jj_consume_token(RBRACE);
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Labeled Statement (maps to literal field)
-/////////////////////////////////////////////////////
-  final public void LabeledStatement() throws ParseException {
- /*@bgen(jjtree) LabeledStatement */
-  ASTLabeledStatement jjtn000 = new ASTLabeledStatement(this, JJTLABELEDSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      Identifier();
-      jj_consume_token(COLON);
-      Substatement();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// If Statement 
-/////////////////////////////////////////////////////
-  final public void IfStatement() throws ParseException {
- /*@bgen(jjtree) IfStatement */
-  ASTIfStatement jjtn000 = new ASTIfStatement(this, JJTIFSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(IF);
-      jj_consume_token(LPAREN);
-      ListExpression();
-      jj_consume_token(RPAREN);
-      Substatement();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ELSE:
-        jj_consume_token(ELSE);
-        Substatement();
-        break;
-      default:
-        jj_la1[67] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Switch Statement 
-/////////////////////////////////////////////////////
-  final public void SwitchStatement() throws ParseException {
- /*@bgen(jjtree) SwitchStatement */
-  ASTSwitchStatement jjtn000 = new ASTSwitchStatement(this, JJTSWITCHSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(SWITCH);
-      jj_consume_token(LPAREN);
-      ListExpression();
-      jj_consume_token(RPAREN);
-      jj_consume_token(LBRACE);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CASE:
-      case _DEFAULT:
-        CaseElements();
-        break;
-      default:
-        jj_la1[68] = jj_gen;
-        ;
-      }
-      jj_consume_token(RBRACE);
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void CaseElements() throws ParseException {
- /*@bgen(jjtree) CaseElements */
-  ASTCaseElements jjtn000 = new ASTCaseElements(this, JJTCASEELEMENTS);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      CaseLabel();
-      label_28:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BREAK:
-        case CASE:
-        case CLASS:
-        case CONST:
-        case CONTINUE:
-        case _DEFAULT:
-        case DELETE:
-        case DO:
-        case FALSE:
-        case FOR:
-        case FUNCTION:
-        case GET:
-        case IF:
-        case INCLUDE:
-        case NAMESPACE:
-        case NEW:
-        case NULL:
-        case PRIVATE:
-        case PUBLIC:
-        case RETURN:
-        case SET:
-        case SUPER:
-        case SWITCH:
-        case THIS:
-        case THROW:
-        case TRUE:
-        case TRY:
-        case TYPEOF:
-        case USE:
-        case VAR:
-        case VOID:
-        case WHILE:
-        case WITH:
-        case EXPORT:
-        case INTERFACE:
-        case PROTECTED:
-        case IMPORT:
-        case DECIMAL_LITERAL:
-        case HEX_LITERAL:
-        case OCTAL_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case STRING_LITERAL:
-        case REGULAR_EXPRESSION:
-        case IDENTIFIER:
-        case LPAREN:
-        case LBRACE:
-        case LBRACKET:
-        case SEMICOLON:
-        case BANG:
-        case TILDE:
-        case INCR:
-        case DECR:
-        case PLUS:
-        case MINUS:
-          ;
-          break;
-        default:
-          jj_la1[69] = jj_gen;
-          break label_28;
-        }
-        CaseElement();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void CaseElement() throws ParseException {
- /*@bgen(jjtree) CaseElement */
-  ASTCaseElement jjtn000 = new ASTCaseElement(this, JJTCASEELEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case BREAK:
-      case CLASS:
-      case CONST:
-      case CONTINUE:
-      case DELETE:
-      case DO:
-      case FALSE:
-      case FOR:
-      case FUNCTION:
-      case GET:
-      case IF:
-      case INCLUDE:
-      case NAMESPACE:
-      case NEW:
-      case NULL:
-      case PRIVATE:
-      case PUBLIC:
-      case RETURN:
-      case SET:
-      case SUPER:
-      case SWITCH:
-      case THIS:
-      case THROW:
-      case TRUE:
-      case TRY:
-      case TYPEOF:
-      case USE:
-      case VAR:
-      case VOID:
-      case WHILE:
-      case WITH:
-      case EXPORT:
-      case INTERFACE:
-      case PROTECTED:
-      case IMPORT:
-      case DECIMAL_LITERAL:
-      case HEX_LITERAL:
-      case OCTAL_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case REGULAR_EXPRESSION:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case LBRACKET:
-      case SEMICOLON:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        Directive();
-        break;
-      case CASE:
-      case _DEFAULT:
-        CaseLabel();
-        break;
-      default:
-        jj_la1[70] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void CaseLabel() throws ParseException {
- /*@bgen(jjtree) CaseLabel */
-  ASTCaseLabel jjtn000 = new ASTCaseLabel(this, JJTCASELABEL);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CASE:
-        jj_consume_token(CASE);
-        ListExpression();
-        jj_consume_token(COLON);
-        break;
-      case _DEFAULT:
-        jj_consume_token(_DEFAULT);
-        jj_consume_token(COLON);
-        break;
-      default:
-        jj_la1[71] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Do-While Statement 
-/////////////////////////////////////////////////////
-  final public void DoStatement() throws ParseException {
- /*@bgen(jjtree) DoStatement */
-  ASTDoStatement jjtn000 = new ASTDoStatement(this, JJTDOSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(DO);
-      Substatement();
-      jj_consume_token(WHILE);
-      jj_consume_token(LPAREN);
-      ListExpression();
-      jj_consume_token(RPAREN);
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// While Statement
-/////////////////////////////////////////////////////
-  final public void WhileStatement() throws ParseException {
- /*@bgen(jjtree) WhileStatement */
-  ASTWhileStatement jjtn000 = new ASTWhileStatement(this, JJTWHILESTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(WHILE);
-      jj_consume_token(LPAREN);
-      ListExpression();
-      jj_consume_token(RPAREN);
-      Substatement();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// For Statements 
-/////////////////////////////////////////////////////
-  final public void ForStatement() throws ParseException {
- /*@bgen(jjtree) ForStatement */
-  ASTForStatement jjtn000 = new ASTForStatement(this, JJTFORSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      if (jj_2_16(2147483647)) {
-        jj_consume_token(FOR);
-        jj_consume_token(LPAREN);
-        ForInBinding();
-        jj_consume_token(IN);
-        ListExpression();
-        jj_consume_token(RPAREN);
-        Substatement();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case FOR:
-          jj_consume_token(FOR);
-          jj_consume_token(LPAREN);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case CONST:
-          case DELETE:
-          case FALSE:
-          case FUNCTION:
-          case GET:
-          case INCLUDE:
-          case NEW:
-          case NULL:
-          case PRIVATE:
-          case PUBLIC:
-          case SET:
-          case SUPER:
-          case THIS:
-          case TRUE:
-          case TYPEOF:
-          case VAR:
-          case VOID:
-          case PROTECTED:
-          case DECIMAL_LITERAL:
-          case HEX_LITERAL:
-          case OCTAL_LITERAL:
-          case FLOATING_POINT_LITERAL:
-          case STRING_LITERAL:
-          case REGULAR_EXPRESSION:
-          case IDENTIFIER:
-          case LPAREN:
-          case LBRACE:
-          case LBRACKET:
-          case BANG:
-          case TILDE:
-          case INCR:
-          case DECR:
-          case PLUS:
-          case MINUS:
-            ForInitializer();
-            break;
-          default:
-            jj_la1[72] = jj_gen;
-            ;
-          }
-          jj_consume_token(SEMICOLON);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case DELETE:
-          case FALSE:
-          case FUNCTION:
-          case GET:
-          case INCLUDE:
-          case NEW:
-          case NULL:
-          case PRIVATE:
-          case PUBLIC:
-          case SET:
-          case SUPER:
-          case THIS:
-          case TRUE:
-          case TYPEOF:
-          case VOID:
-          case PROTECTED:
-          case DECIMAL_LITERAL:
-          case HEX_LITERAL:
-          case OCTAL_LITERAL:
-          case FLOATING_POINT_LITERAL:
-          case STRING_LITERAL:
-          case REGULAR_EXPRESSION:
-          case IDENTIFIER:
-          case LPAREN:
-          case LBRACE:
-          case LBRACKET:
-          case BANG:
-          case TILDE:
-          case INCR:
-          case DECR:
-          case PLUS:
-          case MINUS:
-            ListExpression();
-            break;
-          default:
-            jj_la1[73] = jj_gen;
-            ;
-          }
-          jj_consume_token(SEMICOLON);
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case DELETE:
-          case FALSE:
-          case FUNCTION:
-          case GET:
-          case INCLUDE:
-          case NEW:
-          case NULL:
-          case PRIVATE:
-          case PUBLIC:
-          case SET:
-          case SUPER:
-          case THIS:
-          case TRUE:
-          case TYPEOF:
-          case VOID:
-          case PROTECTED:
-          case DECIMAL_LITERAL:
-          case HEX_LITERAL:
-          case OCTAL_LITERAL:
-          case FLOATING_POINT_LITERAL:
-          case STRING_LITERAL:
-          case REGULAR_EXPRESSION:
-          case IDENTIFIER:
-          case LPAREN:
-          case LBRACE:
-          case LBRACKET:
-          case BANG:
-          case TILDE:
-          case INCR:
-          case DECR:
-          case PLUS:
-          case MINUS:
-            ListExpression();
-            break;
-          default:
-            jj_la1[74] = jj_gen;
-            ;
-          }
-          jj_consume_token(RPAREN);
-          Substatement();
-          break;
-        default:
-          jj_la1[75] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } catch (Throwable jjte000) {
-           if (jjtc000) {
-             jjtree.clearNodeScope(jjtn000);
-             jjtc000 = false;
-           } else {
-             jjtree.popNode();
-           }
-           if (jjte000 instanceof RuntimeException) {
-             {if (true) throw (RuntimeException)jjte000;}
-           }
-           if (jjte000 instanceof ParseException) {
-             {if (true) throw (ParseException)jjte000;}
-           }
-           {if (true) throw (Error)jjte000;}
-    } finally {
-           if (jjtc000) {
-             jjtree.closeNodeScope(jjtn000, true);
-           }
-    }
-  }
-
-  final public void ForInitializer() throws ParseException {
- /*@bgen(jjtree) ForInitializer */
-  ASTForInitializer jjtn000 = new ASTForInitializer(this, JJTFORINITIALIZER);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      if (jj_2_17(3)) {
-        ListExpressionNoIN();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case CONST:
-        case VAR:
-          VariableDefinitionNoIN();
-          break;
-        case FALSE:
-        case GET:
-        case INCLUDE:
-        case PRIVATE:
-        case PUBLIC:
-        case SET:
-        case TRUE:
-        case PROTECTED:
-        case IDENTIFIER:
-          Attributes();
-          VariableDefinitionNoIN();
-          break;
-        default:
-          jj_la1[76] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void ForInBinding() throws ParseException {
- /*@bgen(jjtree) ForInBinding */
-  ASTForInBinding jjtn000 = new ASTForInBinding(this, JJTFORINBINDING);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      if (jj_2_18(3)) {
-        PostfixExpression();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case CONST:
-        case VAR:
-          VariableDefinitionKind();
-          VariableBindingNoIN();
-          break;
-        case FALSE:
-        case GET:
-        case INCLUDE:
-        case PRIVATE:
-        case PUBLIC:
-        case SET:
-        case TRUE:
-        case PROTECTED:
-        case IDENTIFIER:
-          Attributes();
-          VariableDefinitionKind();
-          VariableBindingNoIN();
-          break;
-        default:
-          jj_la1[77] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// With Statement 
-/////////////////////////////////////////////////////
-  final public void WithStatement() throws ParseException {
- /*@bgen(jjtree) WithStatement */
-  ASTWithStatement jjtn000 = new ASTWithStatement(this, JJTWITHSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(WITH);
-      jj_consume_token(LPAREN);
-      ExpressionStatement();
-      jj_consume_token(RPAREN);
-      Substatement();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Continue and Break Statement
-/////////////////////////////////////////////////////
-  final public void ContinueStatement() throws ParseException {
- /*@bgen(jjtree) ContinueStatement */
-  ASTContinueStatement jjtn000 = new ASTContinueStatement(this, JJTCONTINUESTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(CONTINUE);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case GET:
-      case INCLUDE:
-      case SET:
-      case IDENTIFIER:
-        Identifier();
-        break;
-      default:
-        jj_la1[78] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void BreakStatement() throws ParseException {
- /*@bgen(jjtree) BreakStatement */
-  ASTBreakStatement jjtn000 = new ASTBreakStatement(this, JJTBREAKSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(BREAK);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case GET:
-      case INCLUDE:
-      case SET:
-      case IDENTIFIER:
-        Identifier();
-        break;
-      default:
-        jj_la1[79] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Return Statement
-/////////////////////////////////////////////////////
-  final public void ReturnStatement() throws ParseException {
- /*@bgen(jjtree) ReturnStatement */
-  ASTReturnStatement jjtn000 = new ASTReturnStatement(this, JJTRETURNSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(RETURN);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case DELETE:
-      case FALSE:
-      case FUNCTION:
-      case GET:
-      case INCLUDE:
-      case NEW:
-      case NULL:
-      case PRIVATE:
-      case PUBLIC:
-      case SET:
-      case SUPER:
-      case THIS:
-      case TRUE:
-      case TYPEOF:
-      case VOID:
-      case PROTECTED:
-      case DECIMAL_LITERAL:
-      case HEX_LITERAL:
-      case OCTAL_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case REGULAR_EXPRESSION:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case LBRACKET:
-      case BANG:
-      case TILDE:
-      case INCR:
-      case DECR:
-      case PLUS:
-      case MINUS:
-        ListExpression();
-        break;
-      default:
-        jj_la1[80] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Throw Statement
-/////////////////////////////////////////////////////
-  final public void ThrowStatement() throws ParseException {
- /*@bgen(jjtree) ThrowStatement */
-  ASTThrowStatement jjtn000 = new ASTThrowStatement(this, JJTTHROWSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(THROW);
-      ListExpression();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Try Statement
-/////////////////////////////////////////////////////
-  final public void TryStatement() throws ParseException {
- /*@bgen(jjtree) TryStatement */
-  ASTTryStatement jjtn000 = new ASTTryStatement(this, JJTTRYSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(TRY);
-      Block();
-      label_29:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case CATCH:
-          ;
-          break;
-        default:
-          jj_la1[81] = jj_gen;
-          break label_29;
-        }
-        jj_consume_token(CATCH);
-        jj_consume_token(LPAREN);
-        Identifier();
-        jj_consume_token(RPAREN);
-        Block();
-      }
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case FINALLY:
-        jj_consume_token(FINALLY);
-        Block();
-        break;
-      default:
-        jj_la1[82] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Directives 
-/////////////////////////////////////////////////////
-  final public void Directives() throws ParseException {
- /*@bgen(jjtree) Directives */
-  ASTDirectives jjtn000 = new ASTDirectives(this, JJTDIRECTIVES);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      label_30:
-      while (true) {
-        Directive();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case BREAK:
-        case CLASS:
-        case CONST:
-        case CONTINUE:
-        case DELETE:
-        case DO:
-        case FALSE:
-        case FOR:
-        case FUNCTION:
-        case GET:
-        case IF:
-        case INCLUDE:
-        case NAMESPACE:
-        case NEW:
-        case NULL:
-        case PRIVATE:
-        case PUBLIC:
-        case RETURN:
-        case SET:
-        case SUPER:
-        case SWITCH:
-        case THIS:
-        case THROW:
-        case TRUE:
-        case TRY:
-        case TYPEOF:
-        case USE:
-        case VAR:
-        case VOID:
-        case WHILE:
-        case WITH:
-        case EXPORT:
-        case INTERFACE:
-        case PROTECTED:
-        case IMPORT:
-        case DECIMAL_LITERAL:
-        case HEX_LITERAL:
-        case OCTAL_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case STRING_LITERAL:
-        case REGULAR_EXPRESSION:
-        case IDENTIFIER:
-        case LPAREN:
-        case LBRACE:
-        case LBRACKET:
-        case SEMICOLON:
-        case BANG:
-        case TILDE:
-        case INCR:
-        case DECR:
-        case PLUS:
-        case MINUS:
-          ;
-          break;
-        default:
-          jj_la1[83] = jj_gen;
-          break label_30;
-        }
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void Directive() throws ParseException {
- /*@bgen(jjtree) Directive */
-  ASTDirective jjtn000 = new ASTDirective(this, JJTDIRECTIVE);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case SEMICOLON:
-        EmptyStatement();
-        break;
-      default:
-        jj_la1[84] = jj_gen;
-        if (jj_2_19(3)) {
-          Statement();
-        } else if (jj_2_20(2)) {
-          AnnotatableDirective();
-        } else if (jj_2_21(2)) {
-          Attributes();
-          jj_consume_token(LBRACE);
-          Directives();
-          jj_consume_token(RBRACE);
-        } else if (jj_2_22(2)) {
-          Attributes();
-          AnnotatableDirective();
-        } else {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case INCLUDE:
-            IncludeDirective();
-            Sc();
-            break;
-          case USE:
-            Pragma();
-            Sc();
-            break;
-          default:
-            jj_la1[85] = jj_gen;
-            jj_consume_token(-1);
-            throw new ParseException();
-          }
-        }
-      }
-    } catch (Throwable jjte000) {
-                        if (jjtc000) {
-                          jjtree.clearNodeScope(jjtn000);
-                          jjtc000 = false;
-                        } else {
-                          jjtree.popNode();
-                        }
-                        if (jjte000 instanceof RuntimeException) {
-                          {if (true) throw (RuntimeException)jjte000;}
-                        }
-                        if (jjte000 instanceof ParseException) {
-                          {if (true) throw (ParseException)jjte000;}
-                        }
-                        {if (true) throw (Error)jjte000;}
-    } finally {
-                        if (jjtc000) {
-                          jjtree.closeNodeScope(jjtn000, true);
-                        }
-    }
-  }
-
-  final public void AnnotatableDirective() throws ParseException {
- /*@bgen(jjtree) AnnotatableDirective */
-  ASTAnnotatableDirective jjtn000 = new ASTAnnotatableDirective(this, JJTANNOTATABLEDIRECTIVE);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CONST:
-      case VAR:
-        VariableDefinition();
-        Sc();
-        break;
-      case FUNCTION:
-        FunctionDefinition();
-        break;
-      case CLASS:
-        ClassDefinition();
-        break;
-      case INTERFACE:
-        InterfaceDefinition();
-        break;
-      case NAMESPACE:
-        NamespaceDefinition();
-        Sc();
-        break;
-      case IMPORT:
-        ImportDirective();
-        Sc();
-        break;
-      case EXPORT:
-        ExportDefinition();
-        Sc();
-        break;
-      case USE:
-        UseDirective();
-        Sc();
-        break;
-      default:
-        jj_la1[86] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } catch (Throwable jjte000) {
-           if (jjtc000) {
-             jjtree.clearNodeScope(jjtn000);
-             jjtc000 = false;
-           } else {
-             jjtree.popNode();
-           }
-           if (jjte000 instanceof RuntimeException) {
-             {if (true) throw (RuntimeException)jjte000;}
-           }
-           if (jjte000 instanceof ParseException) {
-             {if (true) throw (ParseException)jjte000;}
-           }
-           {if (true) throw (Error)jjte000;}
-    } finally {
-           if (jjtc000) {
-             jjtree.closeNodeScope(jjtn000, true);
-           }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Attributes
-/////////////////////////////////////////////////////
-  final public void Attributes() throws ParseException {
- /*@bgen(jjtree) Attributes */
-  ASTAttributes jjtn000 = new ASTAttributes(this, JJTATTRIBUTES);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      label_31:
-      while (true) {
-        Attribute();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case FALSE:
-        case GET:
-        case INCLUDE:
-        case PRIVATE:
-        case PUBLIC:
-        case SET:
-        case TRUE:
-        case PROTECTED:
-        case IDENTIFIER:
-          ;
-          break;
-        default:
-          jj_la1[87] = jj_gen;
-          break label_31;
-        }
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void Attribute() throws ParseException {
- /*@bgen(jjtree) Attribute */
-  ASTAttribute jjtn000 = new ASTAttribute(this, JJTATTRIBUTE);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case GET:
-      case INCLUDE:
-      case PRIVATE:
-      case PUBLIC:
-      case SET:
-      case PROTECTED:
-      case IDENTIFIER:
-        AttributeExpression();
-        break;
-      case TRUE:
-        jj_consume_token(TRUE);
-        break;
-      case FALSE:
-        jj_consume_token(FALSE);
-        break;
-      default:
-        jj_la1[88] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } catch (Throwable jjte000) {
-                       if (jjtc000) {
-                         jjtree.clearNodeScope(jjtn000);
-                         jjtc000 = false;
-                       } else {
-                         jjtree.popNode();
-                       }
-                       if (jjte000 instanceof RuntimeException) {
-                         {if (true) throw (RuntimeException)jjte000;}
-                       }
-                       if (jjte000 instanceof ParseException) {
-                         {if (true) throw (ParseException)jjte000;}
-                       }
-                       {if (true) throw (Error)jjte000;}
-    } finally {
-                       if (jjtc000) {
-                         jjtree.closeNodeScope(jjtn000, true);
-                       }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Use Directive
-/////////////////////////////////////////////////////
-  final public void UseDirective() throws ParseException {
- /*@bgen(jjtree) UseDirective */
-  ASTUseDirective jjtn000 = new ASTUseDirective(this, JJTUSEDIRECTIVE);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(USE);
-      jj_consume_token(NAMESPACE);
-      jj_consume_token(LPAREN);
-      ListExpression();
-      jj_consume_token(RPAREN);
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Import Directive
-/////////////////////////////////////////////////////
-  final public void ImportDirective() throws ParseException {
- /*@bgen(jjtree) ImportDirective */
-  ASTImportDirective jjtn000 = new ASTImportDirective(this, JJTIMPORTDIRECTIVE);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      if (jj_2_23(3)) {
-        jj_consume_token(IMPORT);
-        PackageName();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case IMPORT:
-          jj_consume_token(IMPORT);
-          Identifier();
-          jj_consume_token(ASSIGN);
-          PackageName();
-          break;
-        default:
-          jj_la1[89] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Include Directive
-/////////////////////////////////////////////////////
-  final public void IncludeDirective() throws ParseException {
- /*@bgen(jjtree) IncludeDirective */
-  ASTIncludeDirective jjtn000 = new ASTIncludeDirective(this, JJTINCLUDEDIRECTIVE);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(INCLUDE);
-      jj_consume_token(STRING_LITERAL);
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Pragma
-/////////////////////////////////////////////////////
-  final public void Pragma() throws ParseException {
- /*@bgen(jjtree) Pragma */
-  ASTPragma jjtn000 = new ASTPragma(this, JJTPRAGMA);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(USE);
-      PragmaItems();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void PragmaItems() throws ParseException {
- /*@bgen(jjtree) PragmaItems */
-  ASTPragmaItems jjtn000 = new ASTPragmaItems(this, JJTPRAGMAITEMS);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      PragmaItem();
-      jj_consume_token(COMMA);
-      PragmaItem();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void PragmaItem() throws ParseException {
- /*@bgen(jjtree) PragmaItem */
-  ASTPragmaItem jjtn000 = new ASTPragmaItem(this, JJTPRAGMAITEM);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      PragmaExpr();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case HOOK:
-        jj_consume_token(HOOK);
-        break;
-      default:
-        jj_la1[90] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void PragmaExpr() throws ParseException {
- /*@bgen(jjtree) PragmaExpr */
-  ASTPragmaExpr jjtn000 = new ASTPragmaExpr(this, JJTPRAGMAEXPR);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      Identifier();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case LPAREN:
-        jj_consume_token(LPAREN);
-        PragmaArgument();
-        jj_consume_token(RPAREN);
-        break;
-      default:
-        jj_la1[91] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void PragmaArgument() throws ParseException {
- /*@bgen(jjtree) PragmaArgument */
-  ASTPragmaArgument jjtn000 = new ASTPragmaArgument(this, JJTPRAGMAARGUMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case TRUE:
-        jj_consume_token(TRUE);
-        break;
-      case FALSE:
-        jj_consume_token(FALSE);
-        break;
-      case DECIMAL_LITERAL:
-        jj_consume_token(DECIMAL_LITERAL);
-        break;
-      case OCTAL_LITERAL:
-        jj_consume_token(OCTAL_LITERAL);
-        break;
-      case HEX_LITERAL:
-        jj_consume_token(HEX_LITERAL);
-        break;
-      case FLOATING_POINT_LITERAL:
-        jj_consume_token(FLOATING_POINT_LITERAL);
-        break;
-      case STRING_LITERAL:
-        jj_consume_token(STRING_LITERAL);
-        break;
-      default:
-        jj_la1[92] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Definitions 
-/////////////////////////////////////////////////////
-
-/////////////////////////////////////////////////////
-// Export Definition 
-/////////////////////////////////////////////////////
-  final public void ExportDefinition() throws ParseException {
- /*@bgen(jjtree) ExportDefinition */
-  ASTExportDefinition jjtn000 = new ASTExportDefinition(this, JJTEXPORTDEFINITION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(EXPORT);
-      ExportBindingList();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void ExportBindingList() throws ParseException {
- /*@bgen(jjtree) ExportBindingList */
-  ASTExportBindingList jjtn000 = new ASTExportBindingList(this, JJTEXPORTBINDINGLIST);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      ExportBinding();
-      label_32:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[93] = jj_gen;
-          break label_32;
-        }
-        jj_consume_token(COMMA);
-        ExportBinding();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void ExportBinding() throws ParseException {
- /*@bgen(jjtree) ExportBinding */
-  ASTExportBinding jjtn000 = new ASTExportBinding(this, JJTEXPORTBINDING);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      if (jj_2_24(2)) {
-        FunctionName();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case GET:
-        case INCLUDE:
-        case SET:
-        case IDENTIFIER:
-          FunctionName();
-          jj_consume_token(ASSIGN);
-          FunctionName();
-          break;
-        default:
-          jj_la1[94] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Variable Definition (in, NoIN)
-/////////////////////////////////////////////////////
-  final public void VariableDefinition() throws ParseException {
- /*@bgen(jjtree) VariableDefinition */
-  ASTVariableDefinition jjtn000 = new ASTVariableDefinition(this, JJTVARIABLEDEFINITION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      VariableDefinitionKind();
-      VariableBindingList();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void VariableDefinitionNoIN() throws ParseException {
- /*@bgen(jjtree) VariableDefinitionNoIN */
-  ASTVariableDefinitionNoIN jjtn000 = new ASTVariableDefinitionNoIN(this, JJTVARIABLEDEFINITIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      VariableDefinitionKind();
-      VariableBindingListNoIN();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void VariableDefinitionKind() throws ParseException {
- /*@bgen(jjtree) VariableDefinitionKind */
-  ASTVariableDefinitionKind jjtn000 = new ASTVariableDefinitionKind(this, JJTVARIABLEDEFINITIONKIND);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case VAR:
-        jj_consume_token(VAR);
-        break;
-      case CONST:
-        jj_consume_token(CONST);
-        break;
-      default:
-        jj_la1[95] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void VariableBindingList() throws ParseException {
- /*@bgen(jjtree) VariableBindingList */
-  ASTVariableBindingList jjtn000 = new ASTVariableBindingList(this, JJTVARIABLEBINDINGLIST);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      VariableBinding();
-      label_33:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[96] = jj_gen;
-          break label_33;
-        }
-        jj_consume_token(COMMA);
-        VariableBinding();
-      }
-    } catch (Throwable jjte000) {
-     if (jjtc000) {
-       jjtree.clearNodeScope(jjtn000);
-       jjtc000 = false;
-     } else {
-       jjtree.popNode();
-     }
-     if (jjte000 instanceof RuntimeException) {
-       {if (true) throw (RuntimeException)jjte000;}
-     }
-     if (jjte000 instanceof ParseException) {
-       {if (true) throw (ParseException)jjte000;}
-     }
-     {if (true) throw (Error)jjte000;}
-    } finally {
-     if (jjtc000) {
-       jjtree.closeNodeScope(jjtn000, true);
-     }
-    }
-  }
-
-  final public void VariableBindingListNoIN() throws ParseException {
- /*@bgen(jjtree) VariableBindingListNoIN */
-  ASTVariableBindingListNoIN jjtn000 = new ASTVariableBindingListNoIN(this, JJTVARIABLEBINDINGLISTNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      VariableBindingNoIN();
-      label_34:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[97] = jj_gen;
-          break label_34;
-        }
-        jj_consume_token(COMMA);
-        VariableBindingNoIN();
-      }
-    } catch (Throwable jjte000) {
-     if (jjtc000) {
-       jjtree.clearNodeScope(jjtn000);
-       jjtc000 = false;
-     } else {
-       jjtree.popNode();
-     }
-     if (jjte000 instanceof RuntimeException) {
-       {if (true) throw (RuntimeException)jjte000;}
-     }
-     if (jjte000 instanceof ParseException) {
-       {if (true) throw (ParseException)jjte000;}
-     }
-     {if (true) throw (Error)jjte000;}
-    } finally {
-     if (jjtc000) {
-       jjtree.closeNodeScope(jjtn000, true);
-     }
-    }
-  }
-
-  final public void VariableBinding() throws ParseException {
- /*@bgen(jjtree) VariableBinding */
-  ASTVariableBinding jjtn000 = new ASTVariableBinding(this, JJTVARIABLEBINDING);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      TypedIdentifier();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSIGN:
-        VariableInitialisation();
-        break;
-      default:
-        jj_la1[98] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void VariableBindingNoIN() throws ParseException {
- /*@bgen(jjtree) VariableBindingNoIN */
-  ASTVariableBindingNoIN jjtn000 = new ASTVariableBindingNoIN(this, JJTVARIABLEBINDINGNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      TypedIdentifierNoIN();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSIGN:
-        VariableInitialisationNoIN();
-        break;
-      default:
-        jj_la1[99] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void VariableInitialisation() throws ParseException {
- /*@bgen(jjtree) VariableInitialisation */
-  ASTVariableInitialisation jjtn000 = new ASTVariableInitialisation(this, JJTVARIABLEINITIALISATION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(ASSIGN);
-      VariableInitializer();
-    } catch (Throwable jjte000) {
-         if (jjtc000) {
-           jjtree.clearNodeScope(jjtn000);
-           jjtc000 = false;
-         } else {
-           jjtree.popNode();
-         }
-         if (jjte000 instanceof RuntimeException) {
-           {if (true) throw (RuntimeException)jjte000;}
-         }
-         if (jjte000 instanceof ParseException) {
-           {if (true) throw (ParseException)jjte000;}
-         }
-         {if (true) throw (Error)jjte000;}
-    } finally {
-         if (jjtc000) {
-           jjtree.closeNodeScope(jjtn000, true);
-         }
-    }
-  }
-
-  final public void VariableInitialisationNoIN() throws ParseException {
- /*@bgen(jjtree) VariableInitialisationNoIN */
-  ASTVariableInitialisationNoIN jjtn000 = new ASTVariableInitialisationNoIN(this, JJTVARIABLEINITIALISATIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(ASSIGN);
-      VariableInitializerNoIN();
-    } catch (Throwable jjte000) {
-         if (jjtc000) {
-           jjtree.clearNodeScope(jjtn000);
-           jjtc000 = false;
-         } else {
-           jjtree.popNode();
-         }
-         if (jjte000 instanceof RuntimeException) {
-           {if (true) throw (RuntimeException)jjte000;}
-         }
-         if (jjte000 instanceof ParseException) {
-           {if (true) throw (ParseException)jjte000;}
-         }
-         {if (true) throw (Error)jjte000;}
-    } finally {
-         if (jjtc000) {
-           jjtree.closeNodeScope(jjtn000, true);
-         }
-    }
-  }
-
-  final public void VariableInitializer() throws ParseException {
- /*@bgen(jjtree) VariableInitializer */
-  ASTVariableInitializer jjtn000 = new ASTVariableInitializer(this, JJTVARIABLEINITIALIZER);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      if (jj_2_25(3)) {
-        AssignmentExpression();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case FALSE:
-        case GET:
-        case INCLUDE:
-        case PRIVATE:
-        case PUBLIC:
-        case SET:
-        case TRUE:
-        case PROTECTED:
-        case IDENTIFIER:
-          Attributes();
-          break;
-        default:
-          jj_la1[100] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void VariableInitializerNoIN() throws ParseException {
- /*@bgen(jjtree) VariableInitializerNoIN */
-  ASTVariableInitializerNoIN jjtn000 = new ASTVariableInitializerNoIN(this, JJTVARIABLEINITIALIZERNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      if (jj_2_26(3)) {
-        AssignmentExpressionNoIN();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case FALSE:
-        case GET:
-        case INCLUDE:
-        case PRIVATE:
-        case PUBLIC:
-        case SET:
-        case TRUE:
-        case PROTECTED:
-        case IDENTIFIER:
-          Attributes();
-          break;
-        default:
-          jj_la1[101] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void TypedIdentifier() throws ParseException {
- /*@bgen(jjtree) TypedIdentifier */
-  ASTTypedIdentifier jjtn000 = new ASTTypedIdentifier(this, JJTTYPEDIDENTIFIER);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      Identifier();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COLON:
-        jj_consume_token(COLON);
-        TypeExpression();
-        break;
-      default:
-        jj_la1[102] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void TypedIdentifierNoIN() throws ParseException {
- /*@bgen(jjtree) TypedIdentifierNoIN */
-  ASTTypedIdentifierNoIN jjtn000 = new ASTTypedIdentifierNoIN(this, JJTTYPEDIDENTIFIERNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      Identifier();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COLON:
-        jj_consume_token(COLON);
-        TypeExpressionNoIN();
-        break;
-      default:
-        jj_la1[103] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Simple Variable Definition 
-/////////////////////////////////////////////////////
-  final public void SimpleVariableDefinition() throws ParseException {
- /*@bgen(jjtree) SimpleVariableDefinition */
-  ASTSimpleVariableDefinition jjtn000 = new ASTSimpleVariableDefinition(this, JJTSIMPLEVARIABLEDEFINITION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(VAR);
-      UntypedVariableBindingList();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void UntypedVariableBindingList() throws ParseException {
- /*@bgen(jjtree) UntypedVariableBindingList */
-  ASTUntypedVariableBindingList jjtn000 = new ASTUntypedVariableBindingList(this, JJTUNTYPEDVARIABLEBINDINGLIST);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      UntypedVariableBinding();
-      label_35:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case COMMA:
-          ;
-          break;
-        default:
-          jj_la1[104] = jj_gen;
-          break label_35;
-        }
-        jj_consume_token(COMMA);
-        UntypedVariableBinding();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void UntypedVariableBinding() throws ParseException {
- /*@bgen(jjtree) UntypedVariableBinding */
-  ASTUntypedVariableBinding jjtn000 = new ASTUntypedVariableBinding(this, JJTUNTYPEDVARIABLEBINDING);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      Identifier();
-      VariableInitialisation();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Function Definition
-/////////////////////////////////////////////////////
-  final public void FunctionDefinition() throws ParseException {
- /*@bgen(jjtree) FunctionDefinition */
-  ASTFunctionDefinition jjtn000 = new ASTFunctionDefinition(this, JJTFUNCTIONDEFINITION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(FUNCTION);
-      FunctionName();
-      FunctionCommon();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void FunctionName() throws ParseException {
- /*@bgen(jjtree) FunctionName */
-  ASTFunctionName jjtn000 = new ASTFunctionName(this, JJTFUNCTIONNAME);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      if (jj_2_27(2)) {
-        jj_consume_token(GET);
-        Identifier();
-      } else if (jj_2_28(2)) {
-        jj_consume_token(SET);
-        Identifier();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case GET:
-        case INCLUDE:
-        case SET:
-        case IDENTIFIER:
-          Identifier();
-          break;
-        default:
-          jj_la1[105] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void FunctionCommon() throws ParseException {
- /*@bgen(jjtree) FunctionCommon */
-  ASTFunctionCommon jjtn000 = new ASTFunctionCommon(this, JJTFUNCTIONCOMMON);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(LPAREN);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CONST:
-      case GET:
-      case INCLUDE:
-      case SET:
-      case IDENTIFIER:
-      case ELIPSE:
-        Parameters();
-        break;
-      default:
-        jj_la1[106] = jj_gen;
-        ;
-      }
-      jj_consume_token(RPAREN);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case COLON:
-        Result();
-        break;
-      default:
-        jj_la1[107] = jj_gen;
-        ;
-      }
-      Block();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void Parameters() throws ParseException {
- /*@bgen(jjtree) Parameters */
-  ASTParameters jjtn000 = new ASTParameters(this, JJTPARAMETERS);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ELIPSE:
-        RestParameters();
-        break;
-      case CONST:
-      case GET:
-      case INCLUDE:
-      case SET:
-      case IDENTIFIER:
-        ParameterInit();
-        label_36:
-        while (true) {
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case COMMA:
-            ;
-            break;
-          default:
-            jj_la1[108] = jj_gen;
-            break label_36;
-          }
-          jj_consume_token(COMMA);
-          ParameterInit();
-        }
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case ELIPSE:
-          RestParameters();
-          break;
-        default:
-          jj_la1[109] = jj_gen;
-          ;
-        }
-        break;
-      default:
-        jj_la1[110] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void Parameter() throws ParseException {
- /*@bgen(jjtree) Parameter */
-  ASTParameter jjtn000 = new ASTParameter(this, JJTPARAMETER);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CONST:
-        jj_consume_token(CONST);
-        break;
-      default:
-        jj_la1[111] = jj_gen;
-        ;
-      }
-      TypedIdentifier();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void ParameterInit() throws ParseException {
- /*@bgen(jjtree) ParameterInit */
-  ASTParameterInit jjtn000 = new ASTParameterInit(this, JJTPARAMETERINIT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      Parameter();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case ASSIGN:
-        jj_consume_token(ASSIGN);
-        AssignmentExpression();
-        break;
-      default:
-        jj_la1[112] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void RestParameters() throws ParseException {
- /*@bgen(jjtree) RestParameters */
-  ASTRestParameters jjtn000 = new ASTRestParameters(this, JJTRESTPARAMETERS);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(ELIPSE);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CONST:
-        jj_consume_token(CONST);
-        Identifier();
-        break;
-      default:
-        jj_la1[113] = jj_gen;
-        ;
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void Result() throws ParseException {
- /*@bgen(jjtree) Result */
-  ASTResult jjtn000 = new ASTResult(this, JJTRESULT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(COLON);
-      TypeExpression();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Class Definition
-/////////////////////////////////////////////////////
-  final public void ClassDefinition() throws ParseException {
- /*@bgen(jjtree) ClassDefinition */
-  ASTClassDefinition jjtn000 = new ASTClassDefinition(this, JJTCLASSDEFINITION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(CLASS);
-      Identifier();
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EXTENDS:
-      case IMPLEMENTS:
-        Inheritance();
-        break;
-      default:
-        jj_la1[114] = jj_gen;
-        ;
-      }
-      Block();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void InterfaceDefinition() throws ParseException {
- /*@bgen(jjtree) InterfaceDefinition */
-  ASTInterfaceDefinition jjtn000 = new ASTInterfaceDefinition(this, JJTINTERFACEDEFINITION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      if (jj_2_29(3)) {
-        jj_consume_token(INTERFACE);
-        Identifier();
-        Sc();
-      } else {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case INTERFACE:
-          jj_consume_token(INTERFACE);
-          Identifier();
-          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-          case EXTENDS:
-            jj_consume_token(EXTENDS);
-            TypeExpressionList();
-            break;
-          default:
-            jj_la1[115] = jj_gen;
-            ;
-          }
-          Block();
-          break;
-        default:
-          jj_la1[116] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
-        }
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void Inheritance() throws ParseException {
- /*@bgen(jjtree) Inheritance */
-  ASTInheritance jjtn000 = new ASTInheritance(this, JJTINHERITANCE);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EXTENDS:
-        jj_consume_token(EXTENDS);
-        TypeExpression();
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case IMPLEMENTS:
-          jj_consume_token(IMPLEMENTS);
-          TypeExpressionList();
-          break;
-        default:
-          jj_la1[117] = jj_gen;
-          ;
-        }
-        break;
-      case IMPLEMENTS:
-        jj_consume_token(IMPLEMENTS);
-        TypeExpressionList();
-        break;
-      default:
-        jj_la1[118] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Namespace Definition 
-/////////////////////////////////////////////////////
-  final public void NamespaceDefinition() throws ParseException {
- /*@bgen(jjtree) NamespaceDefinition */
-  ASTNamespaceDefinition jjtn000 = new ASTNamespaceDefinition(this, JJTNAMESPACEDEFINITION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(NAMESPACE);
-      Identifier();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-/////////////////////////////////////////////////////
-// Package Definition 
-/////////////////////////////////////////////////////
-  final public void PackageDefinition() throws ParseException {
- /*@bgen(jjtree) PackageDefinition */
-  ASTPackageDefinition jjtn000 = new ASTPackageDefinition(this, JJTPACKAGEDEFINITION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      jj_consume_token(PACKAGE);
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case GET:
-      case INCLUDE:
-      case SET:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-        PackageName();
-        break;
-      default:
-        jj_la1[119] = jj_gen;
-        ;
-      }
-      Block();
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void PackageName() throws ParseException {
- /*@bgen(jjtree) PackageName */
-  ASTPackageName jjtn000 = new ASTPackageName(this, JJTPACKAGENAME);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case STRING_LITERAL:
-        jj_consume_token(STRING_LITERAL);
-        break;
-      case GET:
-      case INCLUDE:
-      case SET:
-      case IDENTIFIER:
-        PackageIdentifiers();
-        break;
-      default:
-        jj_la1[120] = jj_gen;
-        jj_consume_token(-1);
-        throw new ParseException();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final public void PackageIdentifiers() throws ParseException {
- /*@bgen(jjtree) PackageIdentifiers */
-  ASTPackageIdentifiers jjtn000 = new ASTPackageIdentifiers(this, JJTPACKAGEIDENTIFIERS);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-    try {
-      Identifier();
-      label_37:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case DOT:
-          ;
-          break;
-        default:
-          jj_la1[121] = jj_gen;
-          break label_37;
-        }
-        jj_consume_token(DOT);
-        Identifier();
-      }
-    } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            {if (true) throw (RuntimeException)jjte000;}
-          }
-          if (jjte000 instanceof ParseException) {
-            {if (true) throw (ParseException)jjte000;}
-          }
-          {if (true) throw (Error)jjte000;}
-    } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-    }
-  }
-
-  final private boolean jj_2_1(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_1(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(0, xla); }
-  }
-
-  final private boolean jj_2_2(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_2(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(1, xla); }
-  }
-
-  final private boolean jj_2_3(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_3(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(2, xla); }
-  }
-
-  final private boolean jj_2_4(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_4(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(3, xla); }
-  }
-
-  final private boolean jj_2_5(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_5(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(4, xla); }
-  }
-
-  final private boolean jj_2_6(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_6(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(5, xla); }
-  }
-
-  final private boolean jj_2_7(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_7(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(6, xla); }
-  }
-
-  final private boolean jj_2_8(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_8(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(7, xla); }
-  }
-
-  final private boolean jj_2_9(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_9(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(8, xla); }
-  }
-
-  final private boolean jj_2_10(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_10(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(9, xla); }
-  }
-
-  final private boolean jj_2_11(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_11(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(10, xla); }
-  }
-
-  final private boolean jj_2_12(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_12(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(11, xla); }
-  }
-
-  final private boolean jj_2_13(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_13(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(12, xla); }
-  }
-
-  final private boolean jj_2_14(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_14(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(13, xla); }
-  }
-
-  final private boolean jj_2_15(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_15(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(14, xla); }
-  }
-
-  final private boolean jj_2_16(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_16(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(15, xla); }
-  }
-
-  final private boolean jj_2_17(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_17(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(16, xla); }
-  }
-
-  final private boolean jj_2_18(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_18(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(17, xla); }
-  }
-
-  final private boolean jj_2_19(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_19(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(18, xla); }
-  }
-
-  final private boolean jj_2_20(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_20(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(19, xla); }
-  }
-
-  final private boolean jj_2_21(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_21(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(20, xla); }
-  }
-
-  final private boolean jj_2_22(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_22(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(21, xla); }
-  }
-
-  final private boolean jj_2_23(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_23(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(22, xla); }
-  }
-
-  final private boolean jj_2_24(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_24(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(23, xla); }
-  }
-
-  final private boolean jj_2_25(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_25(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(24, xla); }
-  }
-
-  final private boolean jj_2_26(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_26(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(25, xla); }
-  }
-
-  final private boolean jj_2_27(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_27(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(26, xla); }
-  }
-
-  final private boolean jj_2_28(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_28(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(27, xla); }
-  }
-
-  final private boolean jj_2_29(int xla) {
-    jj_la = xla; jj_lastpos = jj_scanpos = token;
-    try { return !jj_3_29(); }
-    catch(LookaheadSuccess ls) { return true; }
-    finally { jj_save(28, xla); }
-  }
-
-  final private boolean jj_3R_144() {
-    if (jj_3R_182()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_198()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_239() {
-    if (jj_3R_242()) return true;
-    if (jj_3R_222()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_137() {
-    if (jj_3R_168()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_169()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_166() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_55()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_182() {
-    if (jj_3R_201()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_218()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_220() {
-    if (jj_3R_242()) return true;
-    if (jj_3R_219()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_168() {
-    if (jj_3R_199()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_200()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_135() {
-    if (jj_3R_55()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_166()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_254() {
-    if (jj_3R_257()) return true;
-    if (jj_3R_243()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_221() {
-    if (jj_scan_token(BIT_OR)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_322() {
-    if (jj_scan_token(IMPLEMENTS)) return true;
-    if (jj_3R_315()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_94() {
-    if (jj_3R_135()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_53() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(70)) {
-    jj_scanpos = xsp;
-    if (jj_3R_94()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_201() {
-    if (jj_3R_222()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_239()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_241() {
-    if (jj_3R_257()) return true;
-    if (jj_3R_240()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_306() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_315()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_199() {
-    if (jj_3R_219()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_220()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_263() {
-    if (jj_3R_264()) return true;
-    if (jj_3R_258()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_242() {
-    if (jj_scan_token(XOR)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_130() {
-    if (jj_scan_token(NAMESPACE)) return true;
-    if (jj_3R_55()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_300() {
-    if (jj_3R_305()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_222() {
-    if (jj_3R_243()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_254()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_162() {
-    if (jj_scan_token(INTERFACE)) return true;
-    if (jj_3R_55()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_306()) jj_scanpos = xsp;
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_256() {
-    if (jj_3R_264()) return true;
-    if (jj_3R_255()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_314() {
-    if (jj_scan_token(IMPLEMENTS)) return true;
-    if (jj_3R_315()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_313() {
-    if (jj_scan_token(EXTENDS)) return true;
-    if (jj_3R_286()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_322()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_305() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_313()) {
-    jj_scanpos = xsp;
-    if (jj_3R_314()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_219() {
-    if (jj_3R_240()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_241()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_290() {
-    if (jj_3R_284()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_257() {
-    if (jj_scan_token(BIT_AND)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_129() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_29()) {
-    jj_scanpos = xsp;
-    if (jj_3R_162()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3_29() {
-    if (jj_scan_token(INTERFACE)) return true;
-    if (jj_3R_55()) return true;
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
-    return false;
-  }
-
-  final private boolean jj_3R_128() {
-    if (jj_scan_token(CLASS)) return true;
-    if (jj_3R_55()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_300()) jj_scanpos = xsp;
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_243() {
-    if (jj_3R_258()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_263()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_292() {
-    if (jj_scan_token(CONST)) return true;
-    if (jj_3R_55()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_277() {
-    if (jj_3R_283()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_240() {
-    if (jj_3R_255()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_256()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_293() {
-    if (jj_scan_token(ASSIGN)) return true;
-    if (jj_3R_39()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_283() {
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_286()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_42() {
-    if (jj_3R_60()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_284() {
-    if (jj_scan_token(ELIPSE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_292()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_289() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_285()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_264() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(99)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(102)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(133)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(134)) return true;
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_275() {
-    if (jj_3R_60()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_271() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_275()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(29)) return true;
-    }
-    if (jj_3R_43()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_285() {
-    if (jj_3R_287()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_293()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_258() {
-    if (jj_3R_43()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_271()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_287() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(13)) jj_scanpos = xsp;
-    if (jj_3R_216()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_11() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_42()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(27)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(29)) return true;
-    }
-    }
-    if (jj_3R_43()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_269() {
-    if (jj_3R_273()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_62() {
-    if (jj_3R_101()) return true;
-    if (jj_3R_61()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_95() {
-    if (jj_3R_55()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_281() {
-    if (jj_3R_285()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_289()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_290()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_255() {
-    if (jj_3R_43()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_11()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_280() {
-    if (jj_3R_284()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_273() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_280()) {
-    jj_scanpos = xsp;
-    if (jj_3R_281()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_38() {
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_269()) jj_scanpos = xsp;
-    if (jj_scan_token(RPAREN)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_277()) jj_scanpos = xsp;
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_100() {
-    if (jj_3R_143()) return true;
-    if (jj_3R_99()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_60() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(94)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(93)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(100)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(101)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(30)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(8)) return true;
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_324() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_252()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_28() {
-    if (jj_scan_token(SET)) return true;
-    if (jj_3R_55()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_27() {
-    if (jj_scan_token(GET)) return true;
-    if (jj_3R_55()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_54() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_27()) {
-    jj_scanpos = xsp;
-    if (jj_3_28()) {
-    jj_scanpos = xsp;
-    if (jj_3R_95()) return true;
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_43() {
-    if (jj_3R_61()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_62()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_127() {
-    if (jj_scan_token(FUNCTION)) return true;
-    if (jj_3R_54()) return true;
-    if (jj_3R_38()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_101() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(116)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(117)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(118)) return true;
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_252() {
-    if (jj_3R_55()) return true;
-    if (jj_3R_321()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_142() {
-    if (jj_3R_181()) return true;
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_61() {
-    if (jj_3R_99()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_100()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_187() {
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_205()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_236() {
-    if (jj_3R_252()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_324()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_295() {
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_286()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_143() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(108)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(109)) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_204() {
-    if (jj_scan_token(VAR)) return true;
-    if (jj_3R_236()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_265() {
-    if (jj_scan_token(ELIPSE)) return true;
-    if (jj_3R_39()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_152() {
-    if (jj_3R_55()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_187()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_226() {
-    if (jj_3R_52()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_99() {
-    if (jj_3R_141()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_142()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_224() {
-    if (jj_scan_token(ELIPSE)) return true;
-    if (jj_3R_39()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_216() {
-    if (jj_3R_55()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_295()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_329() {
-    if (jj_3R_52()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_181() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(110)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(111)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(115)) return true;
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3_26() {
-    if (jj_3R_45()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_206() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_26()) {
-    jj_scanpos = xsp;
-    if (jj_3R_226()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_153() {
-    if (jj_3R_188()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_141() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_171()) {
-    jj_scanpos = xsp;
-    if (jj_3R_172()) {
-    jj_scanpos = xsp;
-    if (jj_3R_173()) {
-    jj_scanpos = xsp;
-    if (jj_3R_174()) {
-    jj_scanpos = xsp;
-    if (jj_3R_175()) {
-    jj_scanpos = xsp;
-    if (jj_3R_176()) {
-    jj_scanpos = xsp;
-    if (jj_3R_177()) {
-    jj_scanpos = xsp;
-    if (jj_3R_178()) {
-    jj_scanpos = xsp;
-    if (jj_3R_179()) {
-    jj_scanpos = xsp;
-    if (jj_3R_180()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_171() {
-    if (jj_3R_50()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_180() {
-    if (jj_scan_token(BANG)) return true;
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_179() {
-    if (jj_scan_token(TILDE)) return true;
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_178() {
-    if (jj_scan_token(MINUS)) return true;
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_327() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_25()) {
-    jj_scanpos = xsp;
-    if (jj_3R_329()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_177() {
-    if (jj_scan_token(PLUS)) return true;
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_25() {
-    if (jj_3R_39()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_176() {
-    if (jj_scan_token(DECR)) return true;
-    if (jj_3R_50()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_5() {
-    if (jj_3R_41()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_59() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_64()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_265()) jj_scanpos = xsp;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_175() {
-    if (jj_scan_token(INCR)) return true;
-    if (jj_3R_50()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_174() {
-    if (jj_scan_token(TYPEOF)) return true;
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_173() {
-    if (jj_scan_token(VOID)) return true;
-    if (jj_3R_141()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_172() {
-    if (jj_scan_token(DELETE)) return true;
-    if (jj_3R_50()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_312() {
-    if (jj_3R_321()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_188() {
-    if (jj_scan_token(ASSIGN)) return true;
-    if (jj_3R_206()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_58() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_3R_64()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_224()) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_330() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_119()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_321() {
-    if (jj_scan_token(ASSIGN)) return true;
-    if (jj_3R_327()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_10() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_scan_token(ELIPSE)) return true;
-    if (jj_3R_39()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_41() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_9()) {
-    jj_scanpos = xsp;
-    if (jj_3_10()) {
-    jj_scanpos = xsp;
-    if (jj_3R_59()) return true;
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3_9() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_119() {
-    if (jj_3R_152()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_153()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_304() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_196()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_8() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(ELIPSE)) return true;
-    if (jj_3R_39()) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_7() {
-    if (jj_scan_token(LBRACKET)) return true;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_196() {
-    if (jj_3R_216()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_312()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_40() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_57()) {
-    jj_scanpos = xsp;
-    if (jj_3_7()) {
-    jj_scanpos = xsp;
-    if (jj_3_8()) {
-    jj_scanpos = xsp;
-    if (jj_3R_58()) return true;
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_57() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_3R_98()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_194() {
-    if (jj_3R_40()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_328() {
-    if (jj_3R_119()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_330()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_160() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_193()) {
-    jj_scanpos = xsp;
-    if (jj_3R_194()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_193() {
-    if (jj_3R_41()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_4() {
-    if (jj_3R_40()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_124() {
-    if (jj_3R_156()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_121() {
-    if (jj_3R_156()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_161() {
-    if (jj_3R_196()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_304()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_156() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(106)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(107)) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_118() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(47)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(13)) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3_6() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_39()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_scan_token(QUALIFIER)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_235() {
-    if (jj_3R_251()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_234() {
-    if (jj_3R_192()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_253() {
-    if (jj_3R_118()) return true;
-    if (jj_3R_328()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_233() {
-    if (jj_3R_125()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_155() {
-    if (jj_3R_160()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_232() {
-    if (jj_3R_154()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_217() {
-    if (jj_3R_54()) return true;
-    if (jj_scan_token(ASSIGN)) return true;
-    if (jj_3R_54()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_231() {
-    if (jj_3R_191()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_307() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_197()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_214() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_230()) {
-    jj_scanpos = xsp;
-    if (jj_3R_231()) {
-    jj_scanpos = xsp;
-    if (jj_3R_232()) {
-    jj_scanpos = xsp;
-    if (jj_3R_233()) {
-    jj_scanpos = xsp;
-    if (jj_3R_234()) {
-    jj_scanpos = xsp;
-    if (jj_3R_235()) return true;
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_230() {
-    if (jj_3R_170()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_126() {
-    if (jj_3R_118()) return true;
-    if (jj_3R_161()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_251() {
-    if (jj_scan_token(FUNCTION_)) return true;
-    if (jj_3R_41()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_123() {
-    if (jj_3R_160()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_24() {
-    if (jj_3R_54()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_197() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_24()) {
-    jj_scanpos = xsp;
-    if (jj_3R_217()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3_3() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_39()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_scan_token(QUALIFIER)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_192() {
-    if (jj_scan_token(NEW)) return true;
-    if (jj_3R_214()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_4()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3_5()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_164() {
-    if (jj_3R_197()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_307()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_159() {
-    if (jj_3R_192()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_158() {
-    if (jj_3R_191()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_122() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_157()) {
-    jj_scanpos = xsp;
-    if (jj_3R_158()) {
-    jj_scanpos = xsp;
-    if (jj_3R_159()) return true;
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_157() {
-    if (jj_3R_170()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_132() {
-    if (jj_scan_token(EXPORT)) return true;
-    if (jj_3R_164()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_120() {
-    if (jj_3R_154()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_155()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_288() {
-    if (jj_scan_token(QUALIFIER)) return true;
-    if (jj_3R_55()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_84() {
-    if (jj_3R_125()) return true;
-    if (jj_3R_40()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_308() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_316()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_83() {
-    if (jj_3R_122()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_123()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_124()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_82() {
-    if (jj_3R_120()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_121()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3_2() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_39()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_50() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_82()) {
-    jj_scanpos = xsp;
-    if (jj_3R_83()) {
-    jj_scanpos = xsp;
-    if (jj_3R_84()) return true;
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_316() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(43)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(20)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(65)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(67)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(66)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(68)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(70)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_267() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_266()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_125() {
-    if (jj_scan_token(SUPER)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_2()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_282() {
-    if (jj_3R_55()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_308()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_266() {
-    if (jj_3R_39()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_248() {
-    if (jj_3R_261()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_274() {
-    if (jj_3R_282()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(97)) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_261() {
-    if (jj_3R_266()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_267()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_270() {
-    if (jj_3R_274()) return true;
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_274()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_227() {
-    if (jj_scan_token(LBRACKET)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_248()) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACKET)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_260() {
-    if (jj_scan_token(USE)) return true;
-    if (jj_3R_270()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_163() {
-    if (jj_scan_token(IMPORT)) return true;
-    if (jj_3R_55()) return true;
-    if (jj_scan_token(ASSIGN)) return true;
-    if (jj_3R_53()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_276() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_268()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_279() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_39()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_288()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_278() {
-    if (jj_3R_154()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_259() {
-    if (jj_scan_token(INCLUDE)) return true;
-    if (jj_scan_token(STRING_LITERAL)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_272() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(70)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(65)) {
-    jj_scanpos = xsp;
-    if (jj_3R_278()) {
-    jj_scanpos = xsp;
-    if (jj_3R_279()) return true;
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_268() {
-    if (jj_3R_272()) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_39()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_249() {
-    if (jj_3R_262()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_131() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_23()) {
-    jj_scanpos = xsp;
-    if (jj_3R_163()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3_23() {
-    if (jj_scan_token(IMPORT)) return true;
-    if (jj_3R_53()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_262() {
-    if (jj_3R_268()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_276()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_250() {
-    if (jj_scan_token(FUNCTION)) return true;
-    if (jj_3R_55()) return true;
-    if (jj_3R_38()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_134() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_165()) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(43)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(20)) return true;
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_165() {
-    if (jj_3R_120()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_133() {
-    if (jj_scan_token(USE)) return true;
-    if (jj_scan_token(NAMESPACE)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_64()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_228() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_249()) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_1() {
-    if (jj_scan_token(FUNCTION)) return true;
-    if (jj_3R_38()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_229() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_1()) {
-    jj_scanpos = xsp;
-    if (jj_3R_250()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_93() {
-    if (jj_3R_134()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_52() {
-    Token xsp;
-    if (jj_3R_93()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_93()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_208() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(36)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(59)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(35)) return true;
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_92() {
-    if (jj_3R_133()) return true;
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
-    return false;
-  }
-
-  final private boolean jj_3R_246() {
-    if (jj_3R_260()) return true;
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
-    return false;
-  }
-
-  final private boolean jj_3R_91() {
-    if (jj_3R_132()) return true;
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
-    return false;
-  }
-
-  final private boolean jj_3R_245() {
-    if (jj_3R_259()) return true;
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
-    return false;
-  }
-
-  final private boolean jj_3R_90() {
-    if (jj_3R_131()) return true;
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
-    return false;
-  }
-
-  final private boolean jj_3R_89() {
-    if (jj_3R_130()) return true;
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
-    return false;
-  }
-
-  final private boolean jj_3R_88() {
-    if (jj_3R_129()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_87() {
-    if (jj_3R_128()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_86() {
-    if (jj_3R_127()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_223() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_244()) {
-    jj_scanpos = xsp;
-    if (jj_3_19()) {
-    jj_scanpos = xsp;
-    if (jj_3_20()) {
-    jj_scanpos = xsp;
-    if (jj_3_21()) {
-    jj_scanpos = xsp;
-    if (jj_3_22()) {
-    jj_scanpos = xsp;
-    if (jj_3R_245()) {
-    jj_scanpos = xsp;
-    if (jj_3R_246()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_244() {
-    if (jj_3R_203()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_85() {
-    if (jj_3R_126()) return true;
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
-    return false;
-  }
-
-  final private boolean jj_3R_51() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_85()) {
-    jj_scanpos = xsp;
-    if (jj_3R_86()) {
-    jj_scanpos = xsp;
-    if (jj_3R_87()) {
-    jj_scanpos = xsp;
-    if (jj_3R_88()) {
-    jj_scanpos = xsp;
-    if (jj_3R_89()) {
-    jj_scanpos = xsp;
-    if (jj_3R_90()) {
-    jj_scanpos = xsp;
-    if (jj_3R_91()) {
-    jj_scanpos = xsp;
-    if (jj_3R_92()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_213() {
-    if (jj_3R_229()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_212() {
-    if (jj_3R_228()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_211() {
-    if (jj_3R_227()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_210() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_64()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_22() {
-    if (jj_3R_52()) return true;
-    if (jj_3R_51()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_21() {
-    if (jj_3R_52()) return true;
-    if (jj_scan_token(LBRACE)) return true;
-    if (jj_3R_183()) return true;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  final private boolean jj_3_20() {
-    if (jj_3R_51()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_19() {
-    if (jj_3R_47()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_209() {
-    if (jj_scan_token(QUALIFIER)) return true;
-    if (jj_3R_55()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_202() {
-    if (jj_3R_223()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_191() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(33)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(43)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(20)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(65)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(67)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(66)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(68)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(70)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(41)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(77)) {
-    jj_scanpos = xsp;
-    if (jj_3R_210()) {
-    jj_scanpos = xsp;
-    if (jj_3R_211()) {
-    jj_scanpos = xsp;
-    if (jj_3R_212()) {
-    jj_scanpos = xsp;
-    if (jj_3R_213()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_183() {
-    Token xsp;
-    if (jj_3R_202()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_202()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_140() {
-    if (jj_3R_170()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_207() {
-    if (jj_scan_token(QUALIFIER)) return true;
-    if (jj_3R_55()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_98() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_139()) {
-    jj_scanpos = xsp;
-    if (jj_3R_140()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_139() {
-    if (jj_3R_154()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_299() {
-    if (jj_scan_token(FINALLY)) return true;
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_298() {
-    if (jj_scan_token(CATCH)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_55()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_117() {
-    if (jj_scan_token(TRY)) return true;
-    if (jj_3R_105()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_298()) { jj_scanpos = xsp; break; }
-    }
-    xsp = jj_scanpos;
-    if (jj_3R_299()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_170() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_39()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_scan_token(QUALIFIER)) return true;
-    if (jj_3R_55()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_190() {
-    if (jj_3R_208()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_209()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_151() {
-    if (jj_3R_64()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_154() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_189()) {
-    jj_scanpos = xsp;
-    if (jj_3R_190()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_189() {
-    if (jj_3R_55()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_207()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_116() {
-    if (jj_scan_token(THROW)) return true;
-    if (jj_3R_64()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_115() {
-    if (jj_scan_token(RETURN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_151()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_150() {
-    if (jj_3R_55()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_55() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(78)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(25)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(38)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(28)) return true;
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_149() {
-    if (jj_3R_55()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_114() {
-    if (jj_scan_token(BREAK)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_150()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_113() {
-    if (jj_scan_token(CONTINUE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_149()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_80() {
-    if (jj_3R_52()) return true;
-    if (jj_3R_118()) return true;
-    if (jj_3R_119()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_79() {
-    if (jj_3R_118()) return true;
-    if (jj_3R_119()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_112() {
-    if (jj_scan_token(WITH)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_46()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_146()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_195() {
-    if (jj_3R_215()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_238() {
-    if (jj_3R_52()) return true;
-    if (jj_3R_253()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_237() {
-    if (jj_3R_253()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_303() {
-    if (jj_3R_64()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_302() {
-    if (jj_3R_64()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_18() {
-    if (jj_3R_50()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_48() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_18()) {
-    jj_scanpos = xsp;
-    if (jj_3R_79()) {
-    jj_scanpos = xsp;
-    if (jj_3R_80()) return true;
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_148() {
-    if (jj_scan_token(FOR)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_195()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_302()) jj_scanpos = xsp;
-    if (jj_scan_token(SEMICOLON)) return true;
-    xsp = jj_scanpos;
-    if (jj_3R_303()) jj_scanpos = xsp;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_146()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_17() {
-    if (jj_3R_49()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_215() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_17()) {
-    jj_scanpos = xsp;
-    if (jj_3R_237()) {
-    jj_scanpos = xsp;
-    if (jj_3R_238()) return true;
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3_16() {
-    if (jj_scan_token(FOR)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_48()) return true;
-    if (jj_scan_token(IN)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_111() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_147()) {
-    jj_scanpos = xsp;
-    if (jj_3R_148()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_147() {
-    if (jj_scan_token(FOR)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_48()) return true;
-    if (jj_scan_token(IN)) return true;
-    if (jj_3R_64()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_146()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_110() {
-    if (jj_scan_token(WHILE)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_64()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_146()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_109() {
-    if (jj_scan_token(DO)) return true;
-    if (jj_3R_146()) return true;
-    if (jj_scan_token(WHILE)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_64()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_319() {
-    if (jj_scan_token(_DEFAULT)) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_318() {
-    if (jj_scan_token(CASE)) return true;
-    if (jj_3R_64()) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_311() {
-    if (jj_3R_320()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_310() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_318()) {
-    jj_scanpos = xsp;
-    if (jj_3R_319()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_297() {
-    if (jj_3R_301()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_326() {
-    if (jj_3R_310()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_325() {
-    if (jj_3R_223()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_320() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_325()) {
-    jj_scanpos = xsp;
-    if (jj_3R_326()) return true;
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_301() {
-    if (jj_3R_310()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_311()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_108() {
-    if (jj_scan_token(SWITCH)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_64()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_297()) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_296() {
-    if (jj_scan_token(ELSE)) return true;
-    if (jj_3R_146()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_107() {
-    if (jj_scan_token(IF)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_64()) return true;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_3R_146()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_296()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_145() {
-    if (jj_3R_183()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_106() {
-    if (jj_3R_55()) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_146()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_105() {
-    if (jj_scan_token(LBRACE)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_145()) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_104() {
-    if (jj_scan_token(SUPER)) return true;
-    if (jj_3R_41()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_46() {
-    if (jj_3R_64()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_203() {
-    if (jj_scan_token(SEMICOLON)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_186() {
-    if (jj_3R_52()) return true;
-    if (jj_scan_token(LBRACE)) return true;
-    if (jj_3R_309()) return true;
-    if (jj_scan_token(RBRACE)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_185() {
-    if (jj_3R_204()) return true;
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
-    return false;
-  }
-
-  final private boolean jj_3R_146() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_184()) {
-    jj_scanpos = xsp;
-    if (jj_3_15()) {
-    jj_scanpos = xsp;
-    if (jj_3R_185()) {
-    jj_scanpos = xsp;
-    if (jj_3R_186()) return true;
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_184() {
-    if (jj_3R_203()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_317() {
-    if (jj_3R_146()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_309() {
-    Token xsp;
-    if (jj_3R_317()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_317()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_78() {
-    if (jj_3R_117()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_77() {
-    if (jj_3R_116()) return true;
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
-    return false;
-  }
-
-  final private boolean jj_3R_76() {
-    if (jj_3R_115()) return true;
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
-    return false;
-  }
-
-  final private boolean jj_3R_75() {
-    if (jj_3R_114()) return true;
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
-    return false;
-  }
-
-  final private boolean jj_3R_74() {
-    if (jj_3R_113()) return true;
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
-    return false;
-  }
-
-  final private boolean jj_3R_73() {
-    if (jj_3R_112()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_15() {
-    if (jj_3R_47()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_72() {
-    if (jj_3R_111()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_71() {
-    if (jj_3R_110()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_323() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_291()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_70() {
-    if (jj_3R_109()) return true;
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
-    return false;
-  }
-
-  final private boolean jj_3R_69() {
-    if (jj_3R_108()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_68() {
-    if (jj_3R_107()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_67() {
-    if (jj_3R_106()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_66() {
-    if (jj_3R_105()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_65() {
-    if (jj_3R_104()) return true;
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
-    return false;
-  }
-
-  final private boolean jj_3_14() {
-    if (jj_3R_46()) return true;
-    if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;}
-    return false;
-  }
-
-  final private boolean jj_3R_47() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_14()) {
-    jj_scanpos = xsp;
-    if (jj_3R_65()) {
-    jj_scanpos = xsp;
-    if (jj_3R_66()) {
-    jj_scanpos = xsp;
-    if (jj_3R_67()) {
-    jj_scanpos = xsp;
-    if (jj_3R_68()) {
-    jj_scanpos = xsp;
-    if (jj_3R_69()) {
-    jj_scanpos = xsp;
-    if (jj_3R_70()) {
-    jj_scanpos = xsp;
-    if (jj_3R_71()) {
-    jj_scanpos = xsp;
-    if (jj_3R_72()) {
-    jj_scanpos = xsp;
-    if (jj_3R_73()) {
-    jj_scanpos = xsp;
-    if (jj_3R_74()) {
-    jj_scanpos = xsp;
-    if (jj_3R_75()) {
-    jj_scanpos = xsp;
-    if (jj_3R_76()) {
-    jj_scanpos = xsp;
-    if (jj_3R_77()) {
-    jj_scanpos = xsp;
-    if (jj_3R_78()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_81() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_45()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_315() {
-    if (jj_3R_291()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_323()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_103() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_3R_39()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_205() {
-    if (jj_3R_225()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_13() {
-    if (jj_3R_44()) return true;
-    if (jj_3R_45()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_286() {
-    if (jj_3R_291()) return true;
-    return false;
-  }
-
-  final private boolean jj_3_12() {
-    if (jj_3R_44()) return true;
-    if (jj_3R_39()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_49() {
-    if (jj_3R_45()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_81()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_64() {
-    if (jj_3R_39()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_103()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_45() {
-    if (jj_3R_63()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_13()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_39() {
-    if (jj_3R_56()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_12()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_247() {
-    if (jj_scan_token(HOOK)) return true;
-    if (jj_3R_225()) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_225()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_294() {
-    if (jj_scan_token(HOOK)) return true;
-    if (jj_3R_291()) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_291()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_136() {
-    if (jj_scan_token(HOOK)) return true;
-    if (jj_3R_45()) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_45()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_44() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(92)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(121)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(122)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(126)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(119)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(120)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(127)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(128)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(129)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(123)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(125)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(124)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(131)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(132)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(130)) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_97() {
-    if (jj_scan_token(HOOK)) return true;
-    if (jj_3R_39()) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_39()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_225() {
-    if (jj_3R_102()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_247()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_167() {
-    if (jj_scan_token(SC_OR)) return true;
-    if (jj_3R_144()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_291() {
-    if (jj_3R_96()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_294()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_138() {
-    if (jj_scan_token(SC_OR)) return true;
-    if (jj_3R_137()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_63() {
-    if (jj_3R_102()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_136()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_198() {
-    if (jj_scan_token(SC_AND)) return true;
-    if (jj_3R_182()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_56() {
-    if (jj_3R_96()) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_97()) jj_scanpos = xsp;
-    return false;
-  }
-
-  final private boolean jj_3R_169() {
-    if (jj_scan_token(SC_AND)) return true;
-    if (jj_3R_168()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_218() {
-    if (jj_3R_221()) return true;
-    if (jj_3R_201()) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_102() {
-    if (jj_3R_144()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_167()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_96() {
-    if (jj_3R_137()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_138()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  final private boolean jj_3R_200() {
-    if (jj_3R_221()) return true;
-    if (jj_3R_199()) return true;
-    return false;
-  }
-
-  public JSParser20TokenManager token_source;
-  SimpleCharStream jj_input_stream;
-  public Token token, jj_nt;
-  private int jj_ntk;
-  private Token jj_scanpos, jj_lastpos;
-  private int jj_la;
-  public boolean lookingAhead = false;
-  private boolean jj_semLA;
-  private int jj_gen;
-  final private int[] jj_la1 = new int[122];
-  static private int[] jj_la1_0;
-  static private int[] jj_la1_1;
-  static private int[] jj_la1_2;
-  static private int[] jj_la1_3;
-  static private int[] jj_la1_4;
-  static {
-      jj_la1_0();
-      jj_la1_1();
-      jj_la1_2();
-      jj_la1_3();
-      jj_la1_4();
-   }
-   private static void jj_la1_0() {
-      jj_la1_0 = new int[] {0x0,0x96d37200,0x12000000,0x0,0x0,0x12000000,0x12000000,0x900000,0x0,0x800000,0x12000000,0x0,0x0,0x12000000,0x12910000,0x0,0x0,0x0,0x0,0x12900000,0x0,0x900000,0x13900000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x12910000,0x0,0x0,0x0,0x0,0x0,0x0,0x40000100,0x68000100,0x60000100,0x60000100,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x16424200,0x0,0x12100000,0x16d34200,0x96d37200,0x40000,0x8400,0x96d3f600,0x96d3f600,0x8400,0x12912000,0x12910000,0x12910000,0x400000,0x12102000,0x12102000,0x12000000,0x12000000,0x12910000,0x800,0x200000,0x96d37200,0x0,0x10000000,0x80803000,0x12100000,0x12100000,0x0,0x0,0x0,0x100000,0x0,0x12000000,0x2000,0x0,0x0,0x0,0x0,0x12100000,0x12100000,0x0,0x0,0x0,0x12000000,0x12002000,0x0,0x0,0x0,0x12002000,0x2000,0x0,0x2000,0x80000,0x80000,0x0,0x0,0x80000,0x12000000,0x12000000,0x0,};
-   }
-   private static void jj_la1_1() {
-      jj_la1_1 = new int[] {0x4,0xa47fffb,0x40,0x0,0x0,0x8000058,0x8000058,0xa02,0x8000018,0x0,0x8000058,0x0,0x0,0x8000058,0x8012adb,0x0,0x0,0x0,0x0,0x8000adb,0x0,0xa03,0x8000adb,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8012adb,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x615e0,0x0,0x8008858,0x807bffb,0xa47fffb,0x0,0x0,0xa47fffb,0xa47fffb,0x0,0x801aadb,0x8012adb,0x8012adb,0x0,0x8008858,0x8008858,0x40,0x40,0x8012adb,0x0,0x0,0xa47fffb,0x0,0x4000,0x240c000,0x8000858,0x8000858,0x0,0x0,0x0,0x800,0x0,0x40,0x8000,0x0,0x0,0x0,0x0,0x8000858,0x8000858,0x0,0x0,0x0,0x40,0x40,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x1000000,0x0,0x2000000,0x1000000,0x1000000,0x40,0x40,0x0,};
-   }
-   private static void jj_la1_2() {
-      jj_la1_2 = new int[] {0x0,0x80aa605f,0x4000,0x4000000,0x4000000,0x4000,0x24000,0x2a205e,0x0,0x0,0x24042,0x1000000,0x4000000,0x24042,0x802a605e,0x1000000,0x0,0x2220000,0x0,0x2a605e,0x2220000,0x2a205e,0x2a605e,0x0,0x2220000,0x8000000,0x2000000,0x200000,0x8000000,0x20000,0x802a605e,0x0,0x0,0x0,0x0,0x0,0x0,0x60000000,0x60000000,0x60000000,0x60000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10000000,0x1000000,0x1000000,0x1000000,0x84000,0x800000,0x4000,0x80aa605e,0x80aa605f,0x0,0x0,0x80aa605f,0x80aa605f,0x0,0x802a605e,0x802a605e,0x802a605e,0x0,0x4000,0x4000,0x4000,0x4000,0x802a605e,0x0,0x0,0x80aa605f,0x800000,0x0,0x1,0x4000,0x4000,0x1,0x0,0x20000,0x5e,0x1000000,0x4000,0x0,0x1000000,0x1000000,0x10000000,0x10000000,0x4000,0x4000,0x0,0x0,0x1000000,0x4000,0x8004000,0x0,0x1000000,0x8000000,0x8004000,0x0,0x10000000,0x0,0x0,0x0,0x0,0x0,0x0,0x4040,0x4040,0x2000000,};
-   }
-   private static void jj_la1_3() {
-      jj_la1_3 = new int[] {0x0,0x3c01,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3c01,0x0,0xc00,0x0,0xc00,0x0,0x0,0x0,0x0,0xc00,0x0,0x0,0x0,0x0,0x0,0x0,0x3c01,0x8c000,0x8c000,0x3000,0x3000,0x700000,0x700000,0x30,0x30,0x30,0x30,0x48,0x48,0x48,0x10000,0x10000,0x40000,0x40000,0x20000,0x20000,0x100,0x100,0x80,0x80,0x2,0x2,0x2,0x2,0xff800000,0x0,0x0,0x0,0x0,0x0,0x0,0x3c01,0x3c01,0x0,0x0,0x3c01,0x3c01,0x0,0x3c01,0x3c01,0x3c01,0x0,0x0,0x0,0x0,0x0,0x3c01,0x0,0x0,0x3c01,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4,0x4,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
-   }
-   private static void jj_la1_4() {
-      jj_la1_4 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x60,0x60,0x60,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
-   }
-  final private JJCalls[] jj_2_rtns = new JJCalls[29];
-  private boolean jj_rescan = false;
-  private int jj_gc = 0;
-
-  public JSParser20(java.io.InputStream stream) {
-     this(stream, null);
-  }
-  public JSParser20(java.io.InputStream stream, String encoding) {
-    try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
-    token_source = new JSParser20TokenManager(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 122; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  public void ReInit(java.io.InputStream stream) {
-     ReInit(stream, null);
-  }
-  public void ReInit(java.io.InputStream stream, String encoding) {
-    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
-    token_source.ReInit(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jjtree.reset();
-    jj_gen = 0;
-    for (int i = 0; i < 122; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  public JSParser20(java.io.Reader stream) {
-    jj_input_stream = new SimpleCharStream(stream, 1, 1);
-    token_source = new JSParser20TokenManager(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 122; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  public void ReInit(java.io.Reader stream) {
-    jj_input_stream.ReInit(stream, 1, 1);
-    token_source.ReInit(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jjtree.reset();
-    jj_gen = 0;
-    for (int i = 0; i < 122; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  public JSParser20(JSParser20TokenManager tm) {
-    token_source = tm;
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 122; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  public void ReInit(JSParser20TokenManager tm) {
-    token_source = tm;
-    token = new Token();
-    jj_ntk = -1;
-    jjtree.reset();
-    jj_gen = 0;
-    for (int i = 0; i < 122; i++) jj_la1[i] = -1;
-    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
-  }
-
-  final private Token jj_consume_token(int kind) throws ParseException {
-    Token oldToken;
-    if ((oldToken = token).next != null) token = token.next;
-    else token = token.next = token_source.getNextToken();
-    jj_ntk = -1;
-    if (token.kind == kind) {
-      jj_gen++;
-      if (++jj_gc > 100) {
-        jj_gc = 0;
-        for (int i = 0; i < jj_2_rtns.length; i++) {
-          JJCalls c = jj_2_rtns[i];
-          while (c != null) {
-            if (c.gen < jj_gen) c.first = null;
-            c = c.next;
-          }
-        }
-      }
-      return token;
-    }
-    token = oldToken;
-    jj_kind = kind;
-    throw generateParseException();
-  }
-
-  static private final class LookaheadSuccess extends java.lang.Error { }
-  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
-  final private boolean jj_scan_token(int kind) {
-    if (jj_scanpos == jj_lastpos) {
-      jj_la--;
-      if (jj_scanpos.next == null) {
-        jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
-      } else {
-        jj_lastpos = jj_scanpos = jj_scanpos.next;
-      }
-    } else {
-      jj_scanpos = jj_scanpos.next;
-    }
-    if (jj_rescan) {
-      int i = 0; Token tok = token;
-      while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
-      if (tok != null) jj_add_error_token(kind, i);
-    }
-    if (jj_scanpos.kind != kind) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
-    return false;
-  }
-
-  final public Token getNextToken() {
-    if (token.next != null) token = token.next;
-    else token = token.next = token_source.getNextToken();
-    jj_ntk = -1;
-    jj_gen++;
-    return token;
-  }
-
-  final public Token getToken(int index) {
-    Token t = lookingAhead ? jj_scanpos : token;
-    for (int i = 0; i < index; i++) {
-      if (t.next != null) t = t.next;
-      else t = t.next = token_source.getNextToken();
-    }
-    return t;
-  }
-
-  final private int jj_ntk() {
-    if ((jj_nt=token.next) == null)
-      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
-    else
-      return (jj_ntk = jj_nt.kind);
-  }
-
-  private java.util.Vector jj_expentries = new java.util.Vector();
-  private int[] jj_expentry;
-  private int jj_kind = -1;
-  private int[] jj_lasttokens = new int[100];
-  private int jj_endpos;
-
-  private void jj_add_error_token(int kind, int pos) {
-    if (pos >= 100) return;
-    if (pos == jj_endpos + 1) {
-      jj_lasttokens[jj_endpos++] = kind;
-    } else if (jj_endpos != 0) {
-      jj_expentry = new int[jj_endpos];
-      for (int i = 0; i < jj_endpos; i++) {
-        jj_expentry[i] = jj_lasttokens[i];
-      }
-      boolean exists = false;
-      for (java.util.Enumeration e = jj_expentries.elements(); e.hasMoreElements();) {
-        int[] oldentry = (int[])(e.nextElement());
-        if (oldentry.length == jj_expentry.length) {
-          exists = true;
-          for (int i = 0; i < jj_expentry.length; i++) {
-            if (oldentry[i] != jj_expentry[i]) {
-              exists = false;
-              break;
-            }
-          }
-          if (exists) break;
-        }
-      }
-      if (!exists) jj_expentries.addElement(jj_expentry);
-      if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
-    }
-  }
-
-  public ParseException generateParseException() {
-    jj_expentries.removeAllElements();
-    boolean[] la1tokens = new boolean[135];
-    for (int i = 0; i < 135; i++) {
-      la1tokens[i] = false;
-    }
-    if (jj_kind >= 0) {
-      la1tokens[jj_kind] = true;
-      jj_kind = -1;
-    }
-    for (int i = 0; i < 122; i++) {
-      if (jj_la1[i] == jj_gen) {
-        for (int j = 0; j < 32; j++) {
-          if ((jj_la1_0[i] & (1<<j)) != 0) {
-            la1tokens[j] = true;
-          }
-          if ((jj_la1_1[i] & (1<<j)) != 0) {
-            la1tokens[32+j] = true;
-          }
-          if ((jj_la1_2[i] & (1<<j)) != 0) {
-            la1tokens[64+j] = true;
-          }
-          if ((jj_la1_3[i] & (1<<j)) != 0) {
-            la1tokens[96+j] = true;
-          }
-          if ((jj_la1_4[i] & (1<<j)) != 0) {
-            la1tokens[128+j] = true;
-          }
-        }
-      }
-    }
-    for (int i = 0; i < 135; i++) {
-      if (la1tokens[i]) {
-        jj_expentry = new int[1];
-        jj_expentry[0] = i;
-        jj_expentries.addElement(jj_expentry);
-      }
-    }
-    jj_endpos = 0;
-    jj_rescan_token();
-    jj_add_error_token(0, 0);
-    int[][] exptokseq = new int[jj_expentries.size()][];
-    for (int i = 0; i < jj_expentries.size(); i++) {
-      exptokseq[i] = (int[])jj_expentries.elementAt(i);
-    }
-    return new ParseException(token, exptokseq, tokenImage);
-  }
-
-  final public void enable_tracing() {
-  }
-
-  final public void disable_tracing() {
-  }
-
-  final private void jj_rescan_token() {
-    jj_rescan = true;
-    for (int i = 0; i < 29; i++) {
-    try {
-      JJCalls p = jj_2_rtns[i];
-      do {
-        if (p.gen > jj_gen) {
-          jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
-          switch (i) {
-            case 0: jj_3_1(); break;
-            case 1: jj_3_2(); break;
-            case 2: jj_3_3(); break;
-            case 3: jj_3_4(); break;
-            case 4: jj_3_5(); break;
-            case 5: jj_3_6(); break;
-            case 6: jj_3_7(); break;
-            case 7: jj_3_8(); break;
-            case 8: jj_3_9(); break;
-            case 9: jj_3_10(); break;
-            case 10: jj_3_11(); break;
-            case 11: jj_3_12(); break;
-            case 12: jj_3_13(); break;
-            case 13: jj_3_14(); break;
-            case 14: jj_3_15(); break;
-            case 15: jj_3_16(); break;
-            case 16: jj_3_17(); break;
-            case 17: jj_3_18(); break;
-            case 18: jj_3_19(); break;
-            case 19: jj_3_20(); break;
-            case 20: jj_3_21(); break;
-            case 21: jj_3_22(); break;
-            case 22: jj_3_23(); break;
-            case 23: jj_3_24(); break;
-            case 24: jj_3_25(); break;
-            case 25: jj_3_26(); break;
-            case 26: jj_3_27(); break;
-            case 27: jj_3_28(); break;
-            case 28: jj_3_29(); break;
-          }
-        }
-        p = p.next;
-      } while (p != null);
-      } catch(LookaheadSuccess ls) { }
-    }
-    jj_rescan = false;
-  }
-
-  final private void jj_save(int index, int xla) {
-    JJCalls p = jj_2_rtns[index];
-    while (p.gen > jj_gen) {
-      if (p.next == null) { p = p.next = new JJCalls(); break; }
-      p = p.next;
-    }
-    p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
-  }
-
-  static final class JJCalls {
-    int gen;
-    Token first;
-    int arg;
-    JJCalls next;
-  }
-
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JSParser20Constants.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JSParser20Constants.java
deleted file mode 100644
index eedc77c..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JSParser20Constants.java
+++ /dev/null
@@ -1,299 +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.
- */
-/* Generated By:JJTree&JavaCC: Do not edit this line. JSParser20Constants.java */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public interface JSParser20Constants {
-
-  int EOF = 0;
-  int EOL = 1;
-  int WS = 2;
-  int SINGLE_LINE_COMMENT = 5;
-  int MULTI_LINE_COMMENT = 6;
-  int AS = 8;
-  int BREAK = 9;
-  int CASE = 10;
-  int CATCH = 11;
-  int CLASS = 12;
-  int CONST = 13;
-  int CONTINUE = 14;
-  int _DEFAULT = 15;
-  int DELETE = 16;
-  int DO = 17;
-  int ELSE = 18;
-  int EXTENDS = 19;
-  int FALSE = 20;
-  int FINALLY = 21;
-  int FOR = 22;
-  int FUNCTION = 23;
-  int FUNCTION_ = 24;
-  int GET = 25;
-  int IF = 26;
-  int IN = 27;
-  int INCLUDE = 28;
-  int INSTANCEOF = 29;
-  int IS = 30;
-  int NAMESPACE = 31;
-  int NEW = 32;
-  int NULL = 33;
-  int PACKAGE = 34;
-  int PRIVATE = 35;
-  int PUBLIC = 36;
-  int RETURN = 37;
-  int SET = 38;
-  int SUPER = 39;
-  int SWITCH = 40;
-  int THIS = 41;
-  int THROW = 42;
-  int TRUE = 43;
-  int TRY = 44;
-  int TYPEOF = 45;
-  int USE = 46;
-  int VAR = 47;
-  int VOID = 48;
-  int WHILE = 49;
-  int WITH = 50;
-  int ABSTRACT = 51;
-  int DEBUGGER = 52;
-  int ENUM = 53;
-  int EXPORT = 54;
-  int GOTO = 55;
-  int IMPLEMENTS = 56;
-  int INTERFACE = 57;
-  int NATIVE = 58;
-  int PROTECTED = 59;
-  int SYNCHRONIZED = 60;
-  int THROWS = 61;
-  int TRANSIENT = 62;
-  int VOLATILE = 63;
-  int IMPORT = 64;
-  int DECIMAL_LITERAL = 65;
-  int HEX_LITERAL = 66;
-  int OCTAL_LITERAL = 67;
-  int FLOATING_POINT_LITERAL = 68;
-  int EXPONENT = 69;
-  int STRING_LITERAL = 70;
-  int ESCAPE_SEQUENCE = 71;
-  int UNTERMINATED_STRING_LITERAL = 72;
-  int REGX_START_CHAR = 73;
-  int REGX_BODY_CHAR_EXCLUSION = 74;
-  int REGX_BODY_CHAR = 75;
-  int REGEX_END_CHAR = 76;
-  int REGULAR_EXPRESSION = 77;
-  int IDENTIFIER = 78;
-  int LETTER = 79;
-  int DIGIT = 80;
-  int LPAREN = 81;
-  int RPAREN = 82;
-  int LBRACE = 83;
-  int RBRACE = 84;
-  int LBRACKET = 85;
-  int RBRACKET = 86;
-  int SEMICOLON = 87;
-  int COMMA = 88;
-  int DOT = 89;
-  int QUALIFIER = 90;
-  int ELIPSE = 91;
-  int ASSIGN = 92;
-  int GT = 93;
-  int LT = 94;
-  int BANG = 95;
-  int TILDE = 96;
-  int HOOK = 97;
-  int COLON = 98;
-  int EQ = 99;
-  int LE = 100;
-  int GE = 101;
-  int NE = 102;
-  int SC_OR = 103;
-  int SC_AND = 104;
-  int SC_XOR = 105;
-  int INCR = 106;
-  int DECR = 107;
-  int PLUS = 108;
-  int MINUS = 109;
-  int STAR = 110;
-  int SLASH = 111;
-  int BIT_AND = 112;
-  int BIT_OR = 113;
-  int XOR = 114;
-  int REM = 115;
-  int LSHIFT = 116;
-  int RSIGNEDSHIFT = 117;
-  int RUNSIGNEDSHIFT = 118;
-  int PLUSASSIGN = 119;
-  int MINUSASSIGN = 120;
-  int STARASSIGN = 121;
-  int SLASHASSIGN = 122;
-  int ANDASSIGN = 123;
-  int ORASSIGN = 124;
-  int XORASSIGN = 125;
-  int REMASSIGN = 126;
-  int LSHIFTASSIGN = 127;
-  int RSIGNEDSHIFTASSIGN = 128;
-  int RUNSIGNEDSHIFTASSIGN = 129;
-  int SC_ORASSIGN = 130;
-  int SC_ANDASSIGN = 131;
-  int SC_XORASSIGN = 132;
-  int IDENTITYOPER = 133;
-  int NOTIDENTITYOPER = 134;
-
-  int DEFAULT = 0;
-  int IN_SINGLE_LINE_COMMENT = 1;
-  int IN_MULTI_LINE_COMMENT = 2;
-
-  String[] tokenImage = {
-    "<EOF>",
-    "<EOL>",
-    "<WS>",
-    "\"//\"",
-    "\"/*\"",
-    "<SINGLE_LINE_COMMENT>",
-    "\"*/\"",
-    "<token of kind 7>",
-    "\"as\"",
-    "\"break\"",
-    "\"case\"",
-    "\"catch\"",
-    "\"class\"",
-    "\"const\"",
-    "\"continue\"",
-    "\"default\"",
-    "\"delete\"",
-    "\"do\"",
-    "\"else\"",
-    "\"extends\"",
-    "\"false\"",
-    "\"finally\"",
-    "\"for\"",
-    "\"function\"",
-    "\"Function\"",
-    "\"get\"",
-    "\"if\"",
-    "\"in\"",
-    "\"include\"",
-    "\"instanceof\"",
-    "\"is\"",
-    "\"namespace\"",
-    "\"new\"",
-    "\"null\"",
-    "\"package\"",
-    "\"private\"",
-    "\"public\"",
-    "\"return\"",
-    "\"set\"",
-    "\"super\"",
-    "\"switch\"",
-    "\"this\"",
-    "\"throw\"",
-    "\"true\"",
-    "\"try\"",
-    "\"typeof\"",
-    "\"use\"",
-    "\"var\"",
-    "\"void\"",
-    "\"while\"",
-    "\"with\"",
-    "\"abstract\"",
-    "\"debugger\"",
-    "\"enum\"",
-    "\"export\"",
-    "\"goto\"",
-    "\"implements\"",
-    "\"interface\"",
-    "\"native\"",
-    "\"protected\"",
-    "\"synchronized\"",
-    "\"throws\"",
-    "\"transient\"",
-    "\"volatile\"",
-    "\"import\"",
-    "<DECIMAL_LITERAL>",
-    "<HEX_LITERAL>",
-    "<OCTAL_LITERAL>",
-    "<FLOATING_POINT_LITERAL>",
-    "<EXPONENT>",
-    "<STRING_LITERAL>",
-    "<ESCAPE_SEQUENCE>",
-    "<UNTERMINATED_STRING_LITERAL>",
-    "<REGX_START_CHAR>",
-    "<REGX_BODY_CHAR_EXCLUSION>",
-    "<REGX_BODY_CHAR>",
-    "<REGEX_END_CHAR>",
-    "<REGULAR_EXPRESSION>",
-    "<IDENTIFIER>",
-    "<LETTER>",
-    "<DIGIT>",
-    "\"(\"",
-    "\")\"",
-    "\"{\"",
-    "\"}\"",
-    "\"[\"",
-    "\"]\"",
-    "\";\"",
-    "\",\"",
-    "\".\"",
-    "\"::\"",
-    "\"...\"",
-    "\"=\"",
-    "\">\"",
-    "\"<\"",
-    "\"!\"",
-    "\"~\"",
-    "\"?\"",
-    "\":\"",
-    "\"==\"",
-    "\"<=\"",
-    "\">=\"",
-    "\"!=\"",
-    "\"||\"",
-    "\"&&\"",
-    "\"^^\"",
-    "\"++\"",
-    "\"--\"",
-    "\"+\"",
-    "\"-\"",
-    "\"*\"",
-    "\"/\"",
-    "\"&\"",
-    "\"|\"",
-    "\"^\"",
-    "\"%\"",
-    "\"<<\"",
-    "\">>\"",
-    "\">>>\"",
-    "\"+=\"",
-    "\"-=\"",
-    "\"*=\"",
-    "\"/=\"",
-    "\"&=\"",
-    "\"|=\"",
-    "\"^=\"",
-    "\"%=\"",
-    "\"<<=\"",
-    "\">>=\"",
-    "\">>>=\"",
-    "\"||=\"",
-    "\"&&=\"",
-    "\"^^=\"",
-    "\"===\"",
-    "\"!==\"",
-  };
-
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JSParser20TokenManager.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JSParser20TokenManager.java
deleted file mode 100644
index 6456f36..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JSParser20TokenManager.java
+++ /dev/null
@@ -1,2246 +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.
- */
-/* Generated By:JJTree&JavaCC: Do not edit this line. JSParser20TokenManager.java */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-import java.io.IOException;
-
-public class JSParser20TokenManager implements JSParser20Constants
-{
-    private boolean isRegValid = true;
-    public void setRegInvalid()
-    {
-        isRegValid = false;
-    }
-    public void setRegValid()
-    {
-        isRegValid = true;
-    }
-  public  java.io.PrintStream debugStream = System.out;
-  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1, long active2)
-{
-   switch (pos)
-   {
-      case 0:
-         if ((active0 & 0x18L) != 0L || (active1 & 0x400800000000000L) != 0L)
-            return 10;
-         if ((active0 & 0xffffffffffffff00L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 78;
-            return 30;
-         }
-         if ((active1 & 0xa000000L) != 0L)
-            return 5;
-         return -1;
-      case 1:
-         if ((active0 & 0x20000007c020100L) != 0L)
-            return 30;
-         if ((active0 & 0xfdffffff83fdfe00L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            if (jjmatchedPos != 1)
-            {
-               jjmatchedKind = 78;
-               jjmatchedPos = 1;
-            }
-            return 30;
-         }
-         return -1;
-      case 2:
-         if ((active0 & 0xffff2fbeb1bdfe00L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            if (jjmatchedPos != 2)
-            {
-               jjmatchedKind = 78;
-               jjmatchedPos = 2;
-            }
-            return 30;
-         }
-         if ((active0 & 0xd04102400000L) != 0L)
-            return 30;
-         return -1;
-      case 3:
-         if ((active0 & 0xff5a25bcb1b9fa00L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            jjmatchedKind = 78;
-            jjmatchedPos = 3;
-            return 30;
-         }
-         if ((active0 & 0xa50a0200040400L) != 0L)
-            return 30;
-         return -1;
-      case 4:
-         if ((active0 & 0xdf58213cb1a9c000L) != 0L || (active1 & 0x1L) != 0L)
-         {
-            if (jjmatchedPos != 4)
-            {
-               jjmatchedKind = 78;
-               jjmatchedPos = 4;
-            }
-            return 30;
-         }
-         if ((active0 & 0x2002048000103a00L) != 0L)
-            return 30;
-         return -1;
-      case 5:
-         if ((active0 & 0xdb18000cb1a8c000L) != 0L)
-         {
-            jjmatchedKind = 78;
-            jjmatchedPos = 5;
-            return 30;
-         }
-         if ((active0 & 0x2440213000010000L) != 0L || (active1 & 0x1L) != 0L)
-            return 30;
-         return -1;
-      case 6:
-         if ((active0 & 0xdb180000a1804000L) != 0L)
-         {
-            jjmatchedKind = 78;
-            jjmatchedPos = 6;
-            return 30;
-         }
-         if ((active0 & 0xc10288000L) != 0L)
-            return 30;
-         return -1;
-      case 7:
-         if ((active0 & 0x5b000000a0000000L) != 0L)
-         {
-            jjmatchedKind = 78;
-            jjmatchedPos = 7;
-            return 30;
-         }
-         if ((active0 & 0x8018000001804000L) != 0L)
-            return 30;
-         return -1;
-      case 8:
-         if ((active0 & 0x1100000020000000L) != 0L)
-         {
-            jjmatchedKind = 78;
-            jjmatchedPos = 8;
-            return 30;
-         }
-         if ((active0 & 0x4a00000080000000L) != 0L)
-            return 30;
-         return -1;
-      case 9:
-         if ((active0 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 78;
-            jjmatchedPos = 9;
-            return 30;
-         }
-         if ((active0 & 0x100000020000000L) != 0L)
-            return 30;
-         return -1;
-      case 10:
-         if ((active0 & 0x1000000000000000L) != 0L)
-         {
-            jjmatchedKind = 78;
-            jjmatchedPos = 10;
-            return 30;
-         }
-         return -1;
-      default :
-         return -1;
-   }
-}
-private final int jjStartNfa_0(int pos, long active0, long active1, long active2)
-{
-   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0, active1, active2), pos + 1);
-}
-private final int jjStopAtPos(int pos, int kind)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   return pos + 1;
-}
-private final int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) { return pos + 1; }
-   return jjMoveNfa_0(state, pos + 1);
-}
-private final int jjMoveStringLiteralDfa0_0()
-{
-   switch(curChar)
-   {
-      case 33:
-         jjmatchedKind = 95;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x4000000000L, 0x40L);
-      case 37:
-         jjmatchedKind = 115;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x4000000000000000L, 0x0L);
-      case 38:
-         jjmatchedKind = 112;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x800010000000000L, 0x8L);
-      case 40:
-         return jjStopAtPos(0, 81);
-      case 41:
-         return jjStopAtPos(0, 82);
-      case 42:
-         jjmatchedKind = 110;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x200000000000000L, 0x0L);
-      case 43:
-         jjmatchedKind = 108;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x80040000000000L, 0x0L);
-      case 44:
-         return jjStopAtPos(0, 88);
-      case 45:
-         jjmatchedKind = 109;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x100080000000000L, 0x0L);
-      case 46:
-         jjmatchedKind = 89;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x8000000L, 0x0L);
-      case 47:
-         jjmatchedKind = 111;
-         return jjMoveStringLiteralDfa1_0(0x18L, 0x400000000000000L, 0x0L);
-      case 58:
-         jjmatchedKind = 98;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x4000000L, 0x0L);
-      case 59:
-         return jjStopAtPos(0, 87);
-      case 60:
-         jjmatchedKind = 94;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x8010001000000000L, 0x0L);
-      case 61:
-         jjmatchedKind = 92;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x800000000L, 0x20L);
-      case 62:
-         jjmatchedKind = 93;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x60002000000000L, 0x3L);
-      case 63:
-         return jjStopAtPos(0, 97);
-      case 70:
-         return jjMoveStringLiteralDfa1_0(0x1000000L, 0x0L, 0x0L);
-      case 91:
-         return jjStopAtPos(0, 85);
-      case 93:
-         return jjStopAtPos(0, 86);
-      case 94:
-         jjmatchedKind = 114;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x2000020000000000L, 0x10L);
-      case 97:
-         return jjMoveStringLiteralDfa1_0(0x8000000000100L, 0x0L, 0x0L);
-      case 98:
-         return jjMoveStringLiteralDfa1_0(0x200L, 0x0L, 0x0L);
-      case 99:
-         return jjMoveStringLiteralDfa1_0(0x7c00L, 0x0L, 0x0L);
-      case 100:
-         return jjMoveStringLiteralDfa1_0(0x10000000038000L, 0x0L, 0x0L);
-      case 101:
-         return jjMoveStringLiteralDfa1_0(0x600000000c0000L, 0x0L, 0x0L);
-      case 102:
-         return jjMoveStringLiteralDfa1_0(0xf00000L, 0x0L, 0x0L);
-      case 103:
-         return jjMoveStringLiteralDfa1_0(0x80000002000000L, 0x0L, 0x0L);
-      case 105:
-         return jjMoveStringLiteralDfa1_0(0x30000007c000000L, 0x1L, 0x0L);
-      case 110:
-         return jjMoveStringLiteralDfa1_0(0x400000380000000L, 0x0L, 0x0L);
-      case 112:
-         return jjMoveStringLiteralDfa1_0(0x800001c00000000L, 0x0L, 0x0L);
-      case 114:
-         return jjMoveStringLiteralDfa1_0(0x2000000000L, 0x0L, 0x0L);
-      case 115:
-         return jjMoveStringLiteralDfa1_0(0x100001c000000000L, 0x0L, 0x0L);
-      case 116:
-         return jjMoveStringLiteralDfa1_0(0x60003e0000000000L, 0x0L, 0x0L);
-      case 117:
-         return jjMoveStringLiteralDfa1_0(0x400000000000L, 0x0L, 0x0L);
-      case 118:
-         return jjMoveStringLiteralDfa1_0(0x8001800000000000L, 0x0L, 0x0L);
-      case 119:
-         return jjMoveStringLiteralDfa1_0(0x6000000000000L, 0x0L, 0x0L);
-      case 123:
-         return jjStopAtPos(0, 83);
-      case 124:
-         jjmatchedKind = 113;
-         return jjMoveStringLiteralDfa1_0(0x0L, 0x1000008000000000L, 0x4L);
-      case 125:
-         return jjStopAtPos(0, 84);
-      case 126:
-         return jjStopAtPos(0, 96);
-      default :
-         return jjMoveNfa_0(2, 0);
-   }
-}
-private final int jjMoveStringLiteralDfa1_0(long active0, long active1, long active2)
-{
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(0, active0, active1, active2);
-      return 1;
-   }
-   switch(curChar)
-   {
-      case 38:
-         if ((active1 & 0x10000000000L) != 0L)
-         {
-            jjmatchedKind = 104;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x8L);
-      case 42:
-         if ((active0 & 0x10L) != 0L)
-            return jjStopAtPos(1, 4);
-         break;
-      case 43:
-         if ((active1 & 0x40000000000L) != 0L)
-            return jjStopAtPos(1, 106);
-         break;
-      case 45:
-         if ((active1 & 0x80000000000L) != 0L)
-            return jjStopAtPos(1, 107);
-         break;
-      case 46:
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x8000000L, active2, 0L);
-      case 47:
-         if ((active0 & 0x8L) != 0L)
-            return jjStopAtPos(1, 3);
-         break;
-      case 58:
-         if ((active1 & 0x4000000L) != 0L)
-            return jjStopAtPos(1, 90);
-         break;
-      case 60:
-         if ((active1 & 0x10000000000000L) != 0L)
-         {
-            jjmatchedKind = 116;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x8000000000000000L, active2, 0L);
-      case 61:
-         if ((active1 & 0x800000000L) != 0L)
-         {
-            jjmatchedKind = 99;
-            jjmatchedPos = 1;
-         }
-         else if ((active1 & 0x1000000000L) != 0L)
-            return jjStopAtPos(1, 100);
-         else if ((active1 & 0x2000000000L) != 0L)
-            return jjStopAtPos(1, 101);
-         else if ((active1 & 0x4000000000L) != 0L)
-         {
-            jjmatchedKind = 102;
-            jjmatchedPos = 1;
-         }
-         else if ((active1 & 0x80000000000000L) != 0L)
-            return jjStopAtPos(1, 119);
-         else if ((active1 & 0x100000000000000L) != 0L)
-            return jjStopAtPos(1, 120);
-         else if ((active1 & 0x200000000000000L) != 0L)
-            return jjStopAtPos(1, 121);
-         else if ((active1 & 0x400000000000000L) != 0L)
-            return jjStopAtPos(1, 122);
-         else if ((active1 & 0x800000000000000L) != 0L)
-            return jjStopAtPos(1, 123);
-         else if ((active1 & 0x1000000000000000L) != 0L)
-            return jjStopAtPos(1, 124);
-         else if ((active1 & 0x2000000000000000L) != 0L)
-            return jjStopAtPos(1, 125);
-         else if ((active1 & 0x4000000000000000L) != 0L)
-            return jjStopAtPos(1, 126);
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x60L);
-      case 62:
-         if ((active1 & 0x20000000000000L) != 0L)
-         {
-            jjmatchedKind = 117;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x40000000000000L, active2, 0x3L);
-      case 94:
-         if ((active1 & 0x20000000000L) != 0L)
-         {
-            jjmatchedKind = 105;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x10L);
-      case 97:
-         return jjMoveStringLiteralDfa2_0(active0, 0x400800480100c00L, active1, 0L, active2, 0L);
-      case 98:
-         return jjMoveStringLiteralDfa2_0(active0, 0x8000000000000L, active1, 0L, active2, 0L);
-      case 101:
-         return jjMoveStringLiteralDfa2_0(active0, 0x10006102018000L, active1, 0L, active2, 0L);
-      case 102:
-         if ((active0 & 0x4000000L) != 0L)
-            return jjStartNfaWithStates_0(1, 26, 30);
-         break;
-      case 104:
-         return jjMoveStringLiteralDfa2_0(active0, 0x2002060000000000L, active1, 0L, active2, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4000000200000L, active1, 0L, active2, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa2_0(active0, 0x41000L, active1, 0L, active2, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa2_0(active0, 0x100000000000000L, active1, 0x1L, active2, 0L);
-      case 110:
-         if ((active0 & 0x8000000L) != 0L)
-         {
-            jjmatchedKind = 27;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0x220000030000000L, active1, 0L, active2, 0L);
-      case 111:
-         if ((active0 & 0x20000L) != 0L)
-            return jjStartNfaWithStates_0(1, 17, 30);
-         return jjMoveStringLiteralDfa2_0(active0, 0x8081000000406000L, active1, 0L, active2, 0L);
-      case 114:
-         return jjMoveStringLiteralDfa2_0(active0, 0x4800180800000200L, active1, 0L, active2, 0L);
-      case 115:
-         if ((active0 & 0x100L) != 0L)
-            return jjStartNfaWithStates_0(1, 8, 30);
-         else if ((active0 & 0x40000000L) != 0L)
-            return jjStartNfaWithStates_0(1, 30, 30);
-         return jjMoveStringLiteralDfa2_0(active0, 0x400000000000L, active1, 0L, active2, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa2_0(active0, 0x9201800000L, active1, 0L, active2, 0L);
-      case 119:
-         return jjMoveStringLiteralDfa2_0(active0, 0x10000000000L, active1, 0L, active2, 0L);
-      case 120:
-         return jjMoveStringLiteralDfa2_0(active0, 0x40000000080000L, active1, 0L, active2, 0L);
-      case 121:
-         return jjMoveStringLiteralDfa2_0(active0, 0x1000200000000000L, active1, 0L, active2, 0L);
-      case 124:
-         if ((active1 & 0x8000000000L) != 0L)
-         {
-            jjmatchedKind = 103;
-            jjmatchedPos = 1;
-         }
-         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x4L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(0, active0, active1, active2);
-}
-private final int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1, long old2, long active2)
-{
-   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L)
-      return jjStartNfa_0(0, old0, old1, old2); 
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(1, active0, active1, active2);
-      return 2;
-   }
-   switch(curChar)
-   {
-      case 46:
-         if ((active1 & 0x8000000L) != 0L)
-            return jjStopAtPos(2, 91);
-         break;
-      case 61:
-         if ((active1 & 0x8000000000000000L) != 0L)
-            return jjStopAtPos(2, 127);
-         else if ((active2 & 0x1L) != 0L)
-            return jjStopAtPos(2, 128);
-         else if ((active2 & 0x4L) != 0L)
-            return jjStopAtPos(2, 130);
-         else if ((active2 & 0x8L) != 0L)
-            return jjStopAtPos(2, 131);
-         else if ((active2 & 0x10L) != 0L)
-            return jjStopAtPos(2, 132);
-         else if ((active2 & 0x20L) != 0L)
-            return jjStopAtPos(2, 133);
-         else if ((active2 & 0x40L) != 0L)
-            return jjStopAtPos(2, 134);
-         break;
-      case 62:
-         if ((active1 & 0x40000000000000L) != 0L)
-         {
-            jjmatchedKind = 118;
-            jjmatchedPos = 2;
-         }
-         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0L, active2, 0x2L);
-      case 97:
-         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000001000L, active1, 0L, active2, 0L);
-      case 98:
-         return jjMoveStringLiteralDfa3_0(active0, 0x10001000000000L, active1, 0L, active2, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa3_0(active0, 0x410000000L, active1, 0L, active2, 0L);
-      case 101:
-         if ((active0 & 0x400000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 46, 30);
-         return jjMoveStringLiteralDfa3_0(active0, 0x200L, active1, 0L, active2, 0L);
-      case 102:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000L, active1, 0L, active2, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa3_0(active0, 0x3030800000000L, active1, 0L, active2, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000000200110000L, active1, 0L, active2, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa3_0(active0, 0x80000000L, active1, 0L, active2, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa3_0(active0, 0x1000000001a06000L, active1, 0L, active2, 0L);
-      case 111:
-         return jjMoveStringLiteralDfa3_0(active0, 0x800000000000000L, active1, 0L, active2, 0L);
-      case 112:
-         return jjMoveStringLiteralDfa3_0(active0, 0x140208000000000L, active1, 0x1L, active2, 0L);
-      case 114:
-         if ((active0 & 0x400000L) != 0L)
-            return jjStartNfaWithStates_0(2, 22, 30);
-         else if ((active0 & 0x800000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 47, 30);
-         return jjMoveStringLiteralDfa3_0(active0, 0x2000040000000000L, active1, 0L, active2, 0L);
-      case 115:
-         return jjMoveStringLiteralDfa3_0(active0, 0x8000020040400L, active1, 0L, active2, 0L);
-      case 116:
-         if ((active0 & 0x2000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 25, 30);
-         else if ((active0 & 0x4000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 38, 30);
-         return jjMoveStringLiteralDfa3_0(active0, 0x684002000080800L, active1, 0L, active2, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa3_0(active0, 0x20080000000000L, active1, 0L, active2, 0L);
-      case 119:
-         if ((active0 & 0x100000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 32, 30);
-         break;
-      case 121:
-         if ((active0 & 0x100000000000L) != 0L)
-            return jjStartNfaWithStates_0(2, 44, 30);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(1, active0, active1, active2);
-}
-private final int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1, long old2, long active2)
-{
-   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L)
-      return jjStartNfa_0(1, old0, old1, old2); 
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(2, active0, active1, active2);
-      return 3;
-   }
-   switch(curChar)
-   {
-      case 61:
-         if ((active2 & 0x2L) != 0L)
-            return jjStopAtPos(3, 129);
-         break;
-      case 97:
-         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000208200L, active1, 0L, active2, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa4_0(active0, 0x1000000001800800L, active1, 0L, active2, 0L);
-      case 100:
-         if ((active0 & 0x1000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 48, 30);
-         break;
-      case 101:
-         if ((active0 & 0x400L) != 0L)
-            return jjStartNfaWithStates_0(3, 10, 30);
-         else if ((active0 & 0x40000L) != 0L)
-            return jjStartNfaWithStates_0(3, 18, 30);
-         else if ((active0 & 0x80000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 43, 30);
-         return jjMoveStringLiteralDfa4_0(active0, 0x200208080090000L, active1, 0L, active2, 0L);
-      case 104:
-         if ((active0 & 0x4000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 50, 30);
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000000L, active1, 0L, active2, 0L);
-      case 107:
-         return jjMoveStringLiteralDfa4_0(active0, 0x400000000L, active1, 0L, active2, 0L);
-      case 108:
-         if ((active0 & 0x200000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 33, 30);
-         return jjMoveStringLiteralDfa4_0(active0, 0x102001010000000L, active1, 0L, active2, 0L);
-      case 109:
-         if ((active0 & 0x20000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 53, 30);
-         break;
-      case 110:
-         return jjMoveStringLiteralDfa4_0(active0, 0x4000000000000000L, active1, 0L, active2, 0L);
-      case 111:
-         if ((active0 & 0x80000000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 55, 30);
-         return jjMoveStringLiteralDfa4_0(active0, 0x2040040000000000L, active1, 0x1L, active2, 0L);
-      case 115:
-         if ((active0 & 0x20000000000L) != 0L)
-            return jjStartNfaWithStates_0(3, 41, 30);
-         return jjMoveStringLiteralDfa4_0(active0, 0x103000L, active1, 0L, active2, 0L);
-      case 116:
-         return jjMoveStringLiteralDfa4_0(active0, 0x808010020004000L, active1, 0L, active2, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa4_0(active0, 0x10002000000000L, active1, 0L, active2, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa4_0(active0, 0x800000000L, active1, 0L, active2, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(2, active0, active1, active2);
-}
-private final int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1, long old2, long active2)
-{
-   if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L)
-      return jjStartNfa_0(2, old0, old1, old2); 
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(3, active0, active1, 0L);
-      return 4;
-   }
-   switch(curChar)
-   {
-      case 97:
-         return jjMoveStringLiteralDfa5_0(active0, 0xc20000000L, active1, 0L);
-      case 99:
-         return jjMoveStringLiteralDfa5_0(active0, 0x10000000000L, active1, 0L);
-      case 101:
-         if ((active0 & 0x100000L) != 0L)
-            return jjStartNfaWithStates_0(4, 20, 30);
-         else if ((active0 & 0x2000000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 49, 30);
-         return jjMoveStringLiteralDfa5_0(active0, 0x900000000000000L, active1, 0L);
-      case 103:
-         return jjMoveStringLiteralDfa5_0(active0, 0x10000000000000L, active1, 0L);
-      case 104:
-         if ((active0 & 0x800L) != 0L)
-            return jjStartNfaWithStates_0(4, 11, 30);
-         return jjMoveStringLiteralDfa5_0(active0, 0x1000000000000000L, active1, 0L);
-      case 105:
-         return jjMoveStringLiteralDfa5_0(active0, 0x1000004000L, active1, 0L);
-      case 107:
-         if ((active0 & 0x200L) != 0L)
-            return jjStartNfaWithStates_0(4, 9, 30);
-         break;
-      case 108:
-         return jjMoveStringLiteralDfa5_0(active0, 0x200000L, active1, 0L);
-      case 110:
-         return jjMoveStringLiteralDfa5_0(active0, 0x80000L, active1, 0L);
-      case 111:
-         return jjMoveStringLiteralDfa5_0(active0, 0x200000000000L, active1, 0L);
-      case 114:
-         if ((active0 & 0x8000000000L) != 0L)
-            return jjStartNfaWithStates_0(4, 39, 30);
-         return jjMoveStringLiteralDfa5_0(active0, 0x248002000000000L, active1, 0x1L);
-      case 115:
-         if ((active0 & 0x1000L) != 0L)
-            return jjStartNfaWithStates_0(4, 12, 30);
-         return jjMoveStringLiteralDfa5_0(active0, 0x4000000080000000L, active1, 0L);
-      case 116:
-         if ((active0 & 0x2000L) != 0L)
-            return jjStartNfaWithStates_0(4, 13, 30);
-         return jjMoveStringLiteralDfa5_0(active0, 0x8000000001810000L, active1, 0L);
-      case 117:
-         return jjMoveStringLiteralDfa5_0(active0, 0x10008000L, active1, 0L);
-      case 118:
-         return jjMoveStringLiteralDfa5_0(active0, 0x400000000000000L, active1, 0L);
-      case 119:
-         if ((active0 & 0x40000000000L) != 0L)
-         {
-            jjmatchedKind = 42;
-            jjmatchedPos = 4;
-         }
-         return jjMoveStringLiteralDfa5_0(active0, 0x2000000000000000L, active1, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(3, active0, active1, 0L);
-}
-private final int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(3, old0, old1, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(4, active0, active1, 0L);
-      return 5;
-   }
-   switch(curChar)
-   {
-      case 97:
-         return jjMoveStringLiteralDfa6_0(active0, 0x8000000000000L, active1, 0L);
-      case 99:
-         if ((active0 & 0x1000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 36, 30);
-         return jjMoveStringLiteralDfa6_0(active0, 0x800000000000000L, active1, 0L);
-      case 100:
-         return jjMoveStringLiteralDfa6_0(active0, 0x10080000L, active1, 0L);
-      case 101:
-         if ((active0 & 0x10000L) != 0L)
-            return jjStartNfaWithStates_0(5, 16, 30);
-         else if ((active0 & 0x400000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 58, 30);
-         break;
-      case 102:
-         if ((active0 & 0x200000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 45, 30);
-         return jjMoveStringLiteralDfa6_0(active0, 0x200000000000000L, active1, 0L);
-      case 103:
-         return jjMoveStringLiteralDfa6_0(active0, 0x10000400000000L, active1, 0L);
-      case 104:
-         if ((active0 & 0x10000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 40, 30);
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa6_0(active0, 0xc000000001800000L, active1, 0L);
-      case 108:
-         return jjMoveStringLiteralDfa6_0(active0, 0x208000L, active1, 0L);
-      case 109:
-         return jjMoveStringLiteralDfa6_0(active0, 0x100000000000000L, active1, 0L);
-      case 110:
-         if ((active0 & 0x2000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 37, 30);
-         return jjMoveStringLiteralDfa6_0(active0, 0x20004000L, active1, 0L);
-      case 112:
-         return jjMoveStringLiteralDfa6_0(active0, 0x80000000L, active1, 0L);
-      case 114:
-         return jjMoveStringLiteralDfa6_0(active0, 0x1000000000000000L, active1, 0L);
-      case 115:
-         if ((active0 & 0x2000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 61, 30);
-         break;
-      case 116:
-         if ((active0 & 0x40000000000000L) != 0L)
-            return jjStartNfaWithStates_0(5, 54, 30);
-         else if ((active1 & 0x1L) != 0L)
-            return jjStartNfaWithStates_0(5, 64, 30);
-         return jjMoveStringLiteralDfa6_0(active0, 0x800000000L, active1, 0L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(4, active0, active1, 0L);
-}
-private final int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long active1)
-{
-   if (((active0 &= old0) | (active1 &= old1)) == 0L)
-      return jjStartNfa_0(4, old0, old1, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(5, active0, 0L, 0L);
-      return 6;
-   }
-   switch(curChar)
-   {
-      case 97:
-         return jjMoveStringLiteralDfa7_0(active0, 0x200000080000000L);
-      case 99:
-         return jjMoveStringLiteralDfa7_0(active0, 0x8000020000000L);
-      case 101:
-         if ((active0 & 0x10000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 28, 30);
-         else if ((active0 & 0x400000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 34, 30);
-         else if ((active0 & 0x800000000L) != 0L)
-            return jjStartNfaWithStates_0(6, 35, 30);
-         return jjMoveStringLiteralDfa7_0(active0, 0x4110000000000000L);
-      case 108:
-         return jjMoveStringLiteralDfa7_0(active0, 0x8000000000000000L);
-      case 111:
-         return jjMoveStringLiteralDfa7_0(active0, 0x1000000001800000L);
-      case 115:
-         if ((active0 & 0x80000L) != 0L)
-            return jjStartNfaWithStates_0(6, 19, 30);
-         break;
-      case 116:
-         if ((active0 & 0x8000L) != 0L)
-            return jjStartNfaWithStates_0(6, 15, 30);
-         return jjMoveStringLiteralDfa7_0(active0, 0x800000000000000L);
-      case 117:
-         return jjMoveStringLiteralDfa7_0(active0, 0x4000L);
-      case 121:
-         if ((active0 & 0x200000L) != 0L)
-            return jjStartNfaWithStates_0(6, 21, 30);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(5, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa7_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(5, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(6, active0, 0L, 0L);
-      return 7;
-   }
-   switch(curChar)
-   {
-      case 99:
-         return jjMoveStringLiteralDfa8_0(active0, 0x200000080000000L);
-      case 101:
-         if ((active0 & 0x4000L) != 0L)
-            return jjStartNfaWithStates_0(7, 14, 30);
-         else if ((active0 & 0x8000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(7, 63, 30);
-         return jjMoveStringLiteralDfa8_0(active0, 0x800000020000000L);
-      case 110:
-         if ((active0 & 0x800000L) != 0L)
-            return jjStartNfaWithStates_0(7, 23, 30);
-         else if ((active0 & 0x1000000L) != 0L)
-            return jjStartNfaWithStates_0(7, 24, 30);
-         return jjMoveStringLiteralDfa8_0(active0, 0x5100000000000000L);
-      case 114:
-         if ((active0 & 0x10000000000000L) != 0L)
-            return jjStartNfaWithStates_0(7, 52, 30);
-         break;
-      case 116:
-         if ((active0 & 0x8000000000000L) != 0L)
-            return jjStartNfaWithStates_0(7, 51, 30);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(6, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa8_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(6, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(7, active0, 0L, 0L);
-      return 8;
-   }
-   switch(curChar)
-   {
-      case 100:
-         if ((active0 & 0x800000000000000L) != 0L)
-            return jjStartNfaWithStates_0(8, 59, 30);
-         break;
-      case 101:
-         if ((active0 & 0x80000000L) != 0L)
-            return jjStartNfaWithStates_0(8, 31, 30);
-         else if ((active0 & 0x200000000000000L) != 0L)
-            return jjStartNfaWithStates_0(8, 57, 30);
-         break;
-      case 105:
-         return jjMoveStringLiteralDfa9_0(active0, 0x1000000000000000L);
-      case 111:
-         return jjMoveStringLiteralDfa9_0(active0, 0x20000000L);
-      case 116:
-         if ((active0 & 0x4000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(8, 62, 30);
-         return jjMoveStringLiteralDfa9_0(active0, 0x100000000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(7, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa9_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(7, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(8, active0, 0L, 0L);
-      return 9;
-   }
-   switch(curChar)
-   {
-      case 102:
-         if ((active0 & 0x20000000L) != 0L)
-            return jjStartNfaWithStates_0(9, 29, 30);
-         break;
-      case 115:
-         if ((active0 & 0x100000000000000L) != 0L)
-            return jjStartNfaWithStates_0(9, 56, 30);
-         break;
-      case 122:
-         return jjMoveStringLiteralDfa10_0(active0, 0x1000000000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(8, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa10_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(8, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(9, active0, 0L, 0L);
-      return 10;
-   }
-   switch(curChar)
-   {
-      case 101:
-         return jjMoveStringLiteralDfa11_0(active0, 0x1000000000000000L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(9, active0, 0L, 0L);
-}
-private final int jjMoveStringLiteralDfa11_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(9, old0, 0L, 0L);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(10, active0, 0L, 0L);
-      return 11;
-   }
-   switch(curChar)
-   {
-      case 100:
-         if ((active0 & 0x1000000000000000L) != 0L)
-            return jjStartNfaWithStates_0(11, 60, 30);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(10, active0, 0L, 0L);
-}
-private final void jjCheckNAdd(int state)
-{
-   if (jjrounds[state] != jjround)
-   {
-      jjstateSet[jjnewStateCnt++] = state;
-      jjrounds[state] = jjround;
-   }
-}
-private final void jjAddStates(int start, int end)
-{
-   do {
-      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
-   } while (start++ != end);
-}
-private final void jjCheckNAddTwoStates(int state1, int state2)
-{
-   jjCheckNAdd(state1);
-   jjCheckNAdd(state2);
-}
-private final void jjCheckNAddStates(int start, int end)
-{
-   do {
-      jjCheckNAdd(jjnextStates[start]);
-   } while (start++ != end);
-}
-private final void jjCheckNAddStates(int start)
-{
-   jjCheckNAdd(jjnextStates[start]);
-   jjCheckNAdd(jjnextStates[start + 1]);
-}
-static final long[] jjbitVec0 = {
-   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
-};
-private final int jjMoveNfa_0(int startState, int curPos)
-{
-   int[] nextStates;
-   int startsAt = 0;
-   jjnewStateCnt = 124;
-   int i = 1;
-   jjstateSet[0] = startState;
-   int j, kind = 0x7fffffff;
-   for (;;)
-   {
-      if (++jjround == 0x7fffffff)
-         ReInitRounds();
-      if (curChar < 64)
-      {
-         long l = 1L << curChar;
-         MatchLoop: do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 2:
-                  if ((0x3ff000000000000L & l) != 0L)
-                  {
-                     if (kind > 68)
-                        kind = 68;
-                     jjCheckNAddStates(0, 3);
-                  }
-                  else if ((0x100000200L & l) != 0L)
-                  {
-                     if (kind > 2)
-                        kind = 2;
-                     jjCheckNAdd(1);
-                  }
-                  else if ((0x2400L & l) != 0L)
-                  {
-                     if (kind > 1)
-                        kind = 1;
-                     jjCheckNAdd(0);
-                  }
-                  else if (curChar == 34)
-                  {
-                     if (kind > 72)
-                        kind = 72;
-                     jjCheckNAddStates(4, 12);
-                  }
-                  else if (curChar == 39)
-                  {
-                     if (kind > 72)
-                        kind = 72;
-                     jjCheckNAddStates(13, 18);
-                  }
-                  else if (curChar == 36)
-                  {
-                     if (kind > 78)
-                        kind = 78;
-                     jjCheckNAdd(30);
-                  }
-                  else if (curChar == 47)
-                     jjAddStates(19, 20);
-                  else if (curChar == 46)
-                     jjCheckNAdd(5);
-                  if ((0x3fe000000000000L & l) != 0L)
-                  {
-                     if (kind > 65)
-                        kind = 65;
-                     jjCheckNAdd(3);
-                  }
-                  else if (curChar == 48)
-                  {
-                     if (kind > 67)
-                        kind = 67;
-                     jjCheckNAddTwoStates(43, 45);
-                  }
-                  break;
-               case 10:
-                  if ((0xdfff7bffffffdbffL & l) != 0L)
-                     jjCheckNAddStates(21, 23);
-                  break;
-               case 0:
-                  if ((0x2400L & l) == 0L)
-                     break;
-                  if (kind > 1)
-                     kind = 1;
-                  jjCheckNAdd(0);
-                  break;
-               case 1:
-                  if ((0x100000200L & l) == 0L)
-                     break;
-                  if (kind > 2)
-                     kind = 2;
-                  jjCheckNAdd(1);
-                  break;
-               case 3:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 65)
-                     kind = 65;
-                  jjCheckNAdd(3);
-                  break;
-               case 4:
-                  if (curChar == 46)
-                     jjCheckNAdd(5);
-                  break;
-               case 5:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 68)
-                     kind = 68;
-                  jjCheckNAddTwoStates(5, 6);
-                  break;
-               case 7:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(8);
-                  break;
-               case 8:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 68)
-                     kind = 68;
-                  jjCheckNAdd(8);
-                  break;
-               case 9:
-                  if (curChar == 47)
-                     jjAddStates(19, 20);
-                  break;
-               case 11:
-                  if ((0xffff7fffffffdbffL & l) != 0L)
-                     jjCheckNAddStates(21, 23);
-                  break;
-               case 12:
-                  if (curChar == 47)
-                     jjCheckNAddStates(21, 23);
-                  break;
-               case 14:
-                  if (curChar != 47)
-                     break;
-                  if (kind > 77)
-                     kind = 77;
-                  jjAddStates(24, 27);
-                  break;
-               case 29:
-                  if (curChar != 36)
-                     break;
-                  if (kind > 78)
-                     kind = 78;
-                  jjCheckNAdd(30);
-                  break;
-               case 30:
-                  if ((0x3ff001000000000L & l) == 0L)
-                     break;
-                  if (kind > 78)
-                     kind = 78;
-                  jjCheckNAdd(30);
-                  break;
-               case 31:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 68)
-                     kind = 68;
-                  jjCheckNAddStates(0, 3);
-                  break;
-               case 32:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(32, 33);
-                  break;
-               case 33:
-                  if (curChar != 46)
-                     break;
-                  if (kind > 68)
-                     kind = 68;
-                  jjCheckNAddTwoStates(34, 35);
-                  break;
-               case 34:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 68)
-                     kind = 68;
-                  jjCheckNAddTwoStates(34, 35);
-                  break;
-               case 36:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(37);
-                  break;
-               case 37:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 68)
-                     kind = 68;
-                  jjCheckNAdd(37);
-                  break;
-               case 38:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 68)
-                     kind = 68;
-                  jjCheckNAddTwoStates(38, 39);
-                  break;
-               case 40:
-                  if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(41);
-                  break;
-               case 41:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 68)
-                     kind = 68;
-                  jjCheckNAdd(41);
-                  break;
-               case 42:
-                  if (curChar != 48)
-                     break;
-                  if (kind > 67)
-                     kind = 67;
-                  jjCheckNAddTwoStates(43, 45);
-                  break;
-               case 44:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 66)
-                     kind = 66;
-                  jjstateSet[jjnewStateCnt++] = 44;
-                  break;
-               case 45:
-                  if ((0xff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 67)
-                     kind = 67;
-                  jjCheckNAdd(45);
-                  break;
-               case 46:
-                  if (curChar != 39)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(13, 18);
-                  break;
-               case 47:
-                  if ((0xffffff7fffffdbffL & l) != 0L)
-                     jjCheckNAddStates(28, 30);
-                  break;
-               case 49:
-                  if ((0x8400000000L & l) != 0L)
-                     jjCheckNAddStates(28, 30);
-                  break;
-               case 50:
-                  if (curChar == 39 && kind > 70)
-                     kind = 70;
-                  break;
-               case 51:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddStates(31, 34);
-                  break;
-               case 52:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddStates(28, 30);
-                  break;
-               case 53:
-                  if ((0xf000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 54;
-                  break;
-               case 54:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(52);
-                  break;
-               case 56:
-               case 61:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAdd(57);
-                  break;
-               case 57:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(28, 30);
-                  break;
-               case 59:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 60;
-                  break;
-               case 60:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 61;
-                  break;
-               case 62:
-                  if ((0xffffff7fffffdbffL & l) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(35, 37);
-                  break;
-               case 64:
-                  if ((0x8400000000L & l) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(35, 37);
-                  break;
-               case 65:
-                  if ((0x2400L & l) != 0L && kind > 72)
-                     kind = 72;
-                  break;
-               case 66:
-                  if ((0xff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(38, 41);
-                  break;
-               case 67:
-                  if ((0xff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(35, 37);
-                  break;
-               case 68:
-                  if ((0xf000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 69;
-                  break;
-               case 69:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(67);
-                  break;
-               case 71:
-               case 76:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAdd(72);
-                  break;
-               case 72:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(35, 37);
-                  break;
-               case 74:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 75;
-                  break;
-               case 75:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 76;
-                  break;
-               case 77:
-                  if (curChar != 34)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(4, 12);
-                  break;
-               case 78:
-                  if ((0xfffffffbffffdbffL & l) != 0L)
-                     jjCheckNAddStates(42, 44);
-                  break;
-               case 80:
-                  if ((0x8400000000L & l) != 0L)
-                     jjCheckNAddStates(42, 44);
-                  break;
-               case 81:
-                  if (curChar == 34 && kind > 70)
-                     kind = 70;
-                  break;
-               case 82:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddStates(45, 48);
-                  break;
-               case 83:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddStates(42, 44);
-                  break;
-               case 84:
-                  if ((0xf000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 85;
-                  break;
-               case 85:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(83);
-                  break;
-               case 87:
-               case 92:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAdd(88);
-                  break;
-               case 88:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(42, 44);
-                  break;
-               case 90:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 91;
-                  break;
-               case 91:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 92;
-                  break;
-               case 93:
-                  if ((0xfffffffbffffffffL & l) != 0L)
-                     jjCheckNAddStates(49, 51);
-                  break;
-               case 95:
-                  if ((0x2400L & l) != 0L)
-                     jjCheckNAddStates(49, 51);
-                  break;
-               case 96:
-                  if (curChar == 10)
-                     jjCheckNAddStates(49, 51);
-                  break;
-               case 97:
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 96;
-                  break;
-               case 98:
-                  if ((0x8400000000L & l) != 0L)
-                     jjCheckNAddStates(49, 51);
-                  break;
-               case 99:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddStates(52, 55);
-                  break;
-               case 100:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddStates(49, 51);
-                  break;
-               case 101:
-                  if ((0xf000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 102;
-                  break;
-               case 102:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(100);
-                  break;
-               case 104:
-               case 109:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAdd(105);
-                  break;
-               case 105:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(49, 51);
-                  break;
-               case 107:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 108;
-                  break;
-               case 108:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 109;
-                  break;
-               case 110:
-                  if ((0xfffffffbffffdbffL & l) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(56, 58);
-                  break;
-               case 112:
-                  if ((0x8400000000L & l) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(56, 58);
-                  break;
-               case 113:
-                  if ((0xff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(59, 62);
-                  break;
-               case 114:
-                  if ((0xff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(56, 58);
-                  break;
-               case 115:
-                  if ((0xf000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 116;
-                  break;
-               case 116:
-                  if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(114);
-                  break;
-               case 118:
-               case 123:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAdd(119);
-                  break;
-               case 119:
-                  if ((0x3ff000000000000L & l) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(56, 58);
-                  break;
-               case 121:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 122;
-                  break;
-               case 122:
-                  if ((0x3ff000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 123;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         MatchLoop: do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 2:
-               case 30:
-                  if ((0x7fffffe87fffffeL & l) == 0L)
-                     break;
-                  if (kind > 78)
-                     kind = 78;
-                  jjCheckNAdd(30);
-                  break;
-               case 10:
-                  jjCheckNAddStates(21, 23);
-                  if (curChar == 92)
-                     jjCheckNAdd(12);
-                  break;
-               case 6:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(63, 64);
-                  break;
-               case 11:
-                  jjCheckNAddStates(21, 23);
-                  break;
-               case 13:
-                  if (curChar == 92)
-                     jjCheckNAdd(12);
-                  break;
-               case 15:
-                  if ((0x228000000000L & l) != 0L && kind > 77)
-                     kind = 77;
-                  break;
-               case 16:
-                  if (curChar == 105)
-                     jjCheckNAddStates(65, 68);
-                  break;
-               case 17:
-                  if (curChar == 103 && kind > 77)
-                     kind = 77;
-                  break;
-               case 18:
-                  if (curChar == 109 && kind > 77)
-                     kind = 77;
-                  break;
-               case 19:
-                  if (curChar == 103)
-                     jjCheckNAdd(18);
-                  break;
-               case 20:
-                  if (curChar == 109)
-                     jjCheckNAdd(17);
-                  break;
-               case 21:
-                  if (curChar == 103)
-                     jjCheckNAddStates(69, 72);
-                  break;
-               case 22:
-                  if (curChar == 105 && kind > 77)
-                     kind = 77;
-                  break;
-               case 23:
-                  if (curChar == 109)
-                     jjCheckNAdd(22);
-                  break;
-               case 24:
-                  if (curChar == 105)
-                     jjCheckNAdd(18);
-                  break;
-               case 25:
-                  if (curChar == 109)
-                     jjCheckNAddStates(73, 76);
-                  break;
-               case 26:
-                  if (curChar == 105)
-                     jjCheckNAdd(17);
-                  break;
-               case 27:
-                  if (curChar == 103)
-                     jjCheckNAdd(22);
-                  break;
-               case 28:
-                  if (curChar == 92)
-                     jjCheckNAdd(12);
-                  break;
-               case 35:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(77, 78);
-                  break;
-               case 39:
-                  if ((0x2000000020L & l) != 0L)
-                     jjAddStates(79, 80);
-                  break;
-               case 43:
-                  if ((0x100000001000000L & l) != 0L)
-                     jjCheckNAdd(44);
-                  break;
-               case 44:
-                  if ((0x7e0000007eL & l) == 0L)
-                     break;
-                  if (kind > 66)
-                     kind = 66;
-                  jjCheckNAdd(44);
-                  break;
-               case 47:
-                  if ((0xffffffffefffffffL & l) != 0L)
-                     jjCheckNAddStates(28, 30);
-                  break;
-               case 48:
-                  if (curChar == 92)
-                     jjAddStates(81, 85);
-                  break;
-               case 49:
-                  if ((0x14404438000000L & l) != 0L)
-                     jjCheckNAddStates(28, 30);
-                  break;
-               case 55:
-                  if (curChar == 120)
-                     jjstateSet[jjnewStateCnt++] = 56;
-                  break;
-               case 56:
-               case 61:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjCheckNAdd(57);
-                  break;
-               case 57:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjCheckNAddStates(28, 30);
-                  break;
-               case 58:
-                  if (curChar == 117)
-                     jjstateSet[jjnewStateCnt++] = 59;
-                  break;
-               case 59:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 60;
-                  break;
-               case 60:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 61;
-                  break;
-               case 62:
-                  if ((0xffffffffefffffffL & l) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(35, 37);
-                  break;
-               case 63:
-                  if (curChar == 92)
-                     jjAddStates(86, 90);
-                  break;
-               case 64:
-                  if ((0x14404438000000L & l) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(35, 37);
-                  break;
-               case 70:
-                  if (curChar == 120)
-                     jjstateSet[jjnewStateCnt++] = 71;
-                  break;
-               case 71:
-               case 76:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjCheckNAdd(72);
-                  break;
-               case 72:
-                  if ((0x7e0000007eL & l) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(35, 37);
-                  break;
-               case 73:
-                  if (curChar == 117)
-                     jjstateSet[jjnewStateCnt++] = 74;
-                  break;
-               case 74:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 75;
-                  break;
-               case 75:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 76;
-                  break;
-               case 78:
-                  if ((0xffffffffefffffffL & l) != 0L)
-                     jjCheckNAddStates(42, 44);
-                  break;
-               case 79:
-                  if (curChar == 92)
-                     jjAddStates(91, 95);
-                  break;
-               case 80:
-                  if ((0x14404438000000L & l) != 0L)
-                     jjCheckNAddStates(42, 44);
-                  break;
-               case 86:
-                  if (curChar == 120)
-                     jjstateSet[jjnewStateCnt++] = 87;
-                  break;
-               case 87:
-               case 92:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjCheckNAdd(88);
-                  break;
-               case 88:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjCheckNAddStates(42, 44);
-                  break;
-               case 89:
-                  if (curChar == 117)
-                     jjstateSet[jjnewStateCnt++] = 90;
-                  break;
-               case 90:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 91;
-                  break;
-               case 91:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 92;
-                  break;
-               case 93:
-                  if ((0xffffffffefffffffL & l) != 0L)
-                     jjCheckNAddStates(49, 51);
-                  break;
-               case 94:
-                  if (curChar == 92)
-                     jjAddStates(96, 102);
-                  break;
-               case 98:
-                  if ((0x14404438000000L & l) != 0L)
-                     jjCheckNAddStates(49, 51);
-                  break;
-               case 103:
-                  if (curChar == 120)
-                     jjstateSet[jjnewStateCnt++] = 104;
-                  break;
-               case 104:
-               case 109:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjCheckNAdd(105);
-                  break;
-               case 105:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjCheckNAddStates(49, 51);
-                  break;
-               case 106:
-                  if (curChar == 117)
-                     jjstateSet[jjnewStateCnt++] = 107;
-                  break;
-               case 107:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 108;
-                  break;
-               case 108:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 109;
-                  break;
-               case 110:
-                  if ((0xffffffffefffffffL & l) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(56, 58);
-                  break;
-               case 111:
-                  if (curChar == 92)
-                     jjAddStates(103, 107);
-                  break;
-               case 112:
-                  if ((0x14404438000000L & l) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(56, 58);
-                  break;
-               case 117:
-                  if (curChar == 120)
-                     jjstateSet[jjnewStateCnt++] = 118;
-                  break;
-               case 118:
-               case 123:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjCheckNAdd(119);
-                  break;
-               case 119:
-                  if ((0x7e0000007eL & l) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(56, 58);
-                  break;
-               case 120:
-                  if (curChar == 117)
-                     jjstateSet[jjnewStateCnt++] = 121;
-                  break;
-               case 121:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 122;
-                  break;
-               case 122:
-                  if ((0x7e0000007eL & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 123;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         MatchLoop: do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 10:
-               case 11:
-                  if ((jjbitVec0[i2] & l2) != 0L)
-                     jjCheckNAddStates(21, 23);
-                  break;
-               case 47:
-                  if ((jjbitVec0[i2] & l2) != 0L)
-                     jjAddStates(28, 30);
-                  break;
-               case 62:
-                  if ((jjbitVec0[i2] & l2) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(35, 37);
-                  break;
-               case 78:
-                  if ((jjbitVec0[i2] & l2) != 0L)
-                     jjCheckNAddStates(42, 44);
-                  break;
-               case 93:
-                  if ((jjbitVec0[i2] & l2) != 0L)
-                     jjCheckNAddStates(49, 51);
-                  break;
-               case 110:
-                  if ((jjbitVec0[i2] & l2) == 0L)
-                     break;
-                  if (kind > 72)
-                     kind = 72;
-                  jjCheckNAddStates(56, 58);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 124 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-private final int jjMoveStringLiteralDfa0_2()
-{
-   switch(curChar)
-   {
-      case 42:
-         return jjMoveStringLiteralDfa1_2(0x40L);
-      default :
-         return 1;
-   }
-}
-private final int jjMoveStringLiteralDfa1_2(long active0)
-{
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      return 1;
-   }
-   switch(curChar)
-   {
-      case 47:
-         if ((active0 & 0x40L) != 0L)
-            return jjStopAtPos(1, 6);
-         break;
-      default :
-         return 2;
-   }
-   return 2;
-}
-private final int jjMoveStringLiteralDfa0_1()
-{
-   return jjMoveNfa_1(4, 0);
-}
-private final int jjMoveNfa_1(int startState, int curPos)
-{
-   int[] nextStates;
-   int startsAt = 0;
-   jjnewStateCnt = 4;
-   int i = 1;
-   jjstateSet[0] = startState;
-   int j, kind = 0x7fffffff;
-   for (;;)
-   {
-      if (++jjround == 0x7fffffff)
-         ReInitRounds();
-      if (curChar < 64)
-      {
-         long l = 1L << curChar;
-         MatchLoop: do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 4:
-                  if ((0xffffffffffffdbffL & l) != 0L)
-                  {
-                     if (kind > 5)
-                        kind = 5;
-                     jjCheckNAddStates(108, 110);
-                  }
-                  else if ((0x2400L & l) != 0L)
-                  {
-                     if (kind > 5)
-                        kind = 5;
-                  }
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 2;
-                  break;
-               case 0:
-                  if ((0xffffffffffffdbffL & l) == 0L)
-                     break;
-                  kind = 5;
-                  jjCheckNAddStates(108, 110);
-                  break;
-               case 1:
-                  if ((0x2400L & l) != 0L && kind > 5)
-                     kind = 5;
-                  break;
-               case 2:
-                  if (curChar == 10 && kind > 5)
-                     kind = 5;
-                  break;
-               case 3:
-                  if (curChar == 13)
-                     jjstateSet[jjnewStateCnt++] = 2;
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         MatchLoop: do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 4:
-               case 0:
-                  kind = 5;
-                  jjCheckNAddStates(108, 110);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         MatchLoop: do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 4:
-               case 0:
-                  if ((jjbitVec0[i2] & l2) == 0L)
-                     break;
-                  if (kind > 5)
-                     kind = 5;
-                  jjCheckNAddStates(108, 110);
-                  break;
-               default : break;
-            }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 4 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-static final int[] jjnextStates = {
-   32, 33, 38, 39, 78, 79, 81, 93, 81, 110, 111, 65, 94, 47, 48, 50, 
-   62, 63, 65, 10, 28, 11, 13, 14, 15, 16, 21, 25, 47, 48, 50, 47, 
-   48, 52, 50, 62, 63, 65, 62, 63, 67, 65, 78, 79, 81, 78, 79, 83, 
-   81, 93, 81, 94, 93, 100, 81, 94, 110, 111, 65, 110, 111, 114, 65, 7, 
-   8, 17, 18, 19, 20, 22, 18, 23, 24, 22, 17, 26, 27, 36, 37, 40, 
-   41, 49, 51, 53, 55, 58, 64, 66, 68, 70, 73, 80, 82, 84, 86, 89, 
-   95, 97, 98, 99, 101, 103, 106, 112, 113, 115, 117, 120, 0, 1, 3, 
-};
-public static final String[] jjstrLiteralImages = {
-"", null, null, null, null, null, null, null, "\141\163", 
-"\142\162\145\141\153", "\143\141\163\145", "\143\141\164\143\150", "\143\154\141\163\163", 
-"\143\157\156\163\164", "\143\157\156\164\151\156\165\145", "\144\145\146\141\165\154\164", 
-"\144\145\154\145\164\145", "\144\157", "\145\154\163\145", "\145\170\164\145\156\144\163", 
-"\146\141\154\163\145", "\146\151\156\141\154\154\171", "\146\157\162", 
-"\146\165\156\143\164\151\157\156", "\106\165\156\143\164\151\157\156", "\147\145\164", "\151\146", "\151\156", 
-"\151\156\143\154\165\144\145", "\151\156\163\164\141\156\143\145\157\146", "\151\163", 
-"\156\141\155\145\163\160\141\143\145", "\156\145\167", "\156\165\154\154", "\160\141\143\153\141\147\145", 
-"\160\162\151\166\141\164\145", "\160\165\142\154\151\143", "\162\145\164\165\162\156", "\163\145\164", 
-"\163\165\160\145\162", "\163\167\151\164\143\150", "\164\150\151\163", "\164\150\162\157\167", 
-"\164\162\165\145", "\164\162\171", "\164\171\160\145\157\146", "\165\163\145", "\166\141\162", 
-"\166\157\151\144", "\167\150\151\154\145", "\167\151\164\150", 
-"\141\142\163\164\162\141\143\164", "\144\145\142\165\147\147\145\162", "\145\156\165\155", 
-"\145\170\160\157\162\164", "\147\157\164\157", "\151\155\160\154\145\155\145\156\164\163", 
-"\151\156\164\145\162\146\141\143\145", "\156\141\164\151\166\145", "\160\162\157\164\145\143\164\145\144", 
-"\163\171\156\143\150\162\157\156\151\172\145\144", "\164\150\162\157\167\163", "\164\162\141\156\163\151\145\156\164", 
-"\166\157\154\141\164\151\154\145", "\151\155\160\157\162\164", null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, "\50", "\51", "\173", "\175", 
-"\133", "\135", "\73", "\54", "\56", "\72\72", "\56\56\56", "\75", "\76", "\74", 
-"\41", "\176", "\77", "\72", "\75\75", "\74\75", "\76\75", "\41\75", "\174\174", 
-"\46\46", "\136\136", "\53\53", "\55\55", "\53", "\55", "\52", "\57", "\46", "\174", 
-"\136", "\45", "\74\74", "\76\76", "\76\76\76", "\53\75", "\55\75", "\52\75", 
-"\57\75", "\46\75", "\174\75", "\136\75", "\45\75", "\74\74\75", "\76\76\75", 
-"\76\76\76\75", "\174\174\75", "\46\46\75", "\136\136\75", "\75\75\75", "\41\75\75", };
-public static final String[] lexStateNames = {
-   "DEFAULT", 
-   "IN_SINGLE_LINE_COMMENT", 
-   "IN_MULTI_LINE_COMMENT", 
-};
-public static final int[] jjnewLexState = {
-   -1, -1, -1, 1, 2, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-};
-static final long[] jjtoToken = {
-   0xffffffffffffff01L, 0xfffffffffffe615fL, 0x7fL, 
-};
-static final long[] jjtoSkip = {
-   0x66L, 0x0L, 0x0L, 
-};
-static final long[] jjtoSpecial = {
-   0x66L, 0x0L, 0x0L, 
-};
-static final long[] jjtoMore = {
-   0x98L, 0x0L, 0x0L, 
-};
-protected SimpleCharStream input_stream;
-private final int[] jjrounds = new int[124];
-private final int[] jjstateSet = new int[248];
-StringBuffer image;
-int jjimageLen;
-int lengthOfMatch;
-protected char curChar;
-public JSParser20TokenManager(SimpleCharStream stream){
-   if (SimpleCharStream.staticFlag)
-      throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
-   input_stream = stream;
-}
-public JSParser20TokenManager(SimpleCharStream stream, int lexState){
-   this(stream);
-   SwitchTo(lexState);
-}
-public void ReInit(SimpleCharStream stream)
-{
-   jjmatchedPos = jjnewStateCnt = 0;
-   curLexState = defaultLexState;
-   input_stream = stream;
-   ReInitRounds();
-}
-private final void ReInitRounds()
-{
-   int i;
-   jjround = 0x80000001;
-   for (i = 124; i-- > 0;)
-      jjrounds[i] = 0x80000000;
-}
-public void ReInit(SimpleCharStream stream, int lexState)
-{
-   ReInit(stream);
-   SwitchTo(lexState);
-}
-public void SwitchTo(int lexState)
-{
-   if (lexState >= 3 || lexState < 0)
-      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
-   else
-      curLexState = lexState;
-}
-
-protected Token jjFillToken()
-{
-   Token t = Token.newToken(jjmatchedKind);
-   t.kind = jjmatchedKind;
-   if (jjmatchedPos < 0)
-   {
-      if (image == null)
-         t.image = "";
-      else
-         t.image = image.toString();
-      t.beginLine = t.endLine = input_stream.getBeginLine();
-      t.beginColumn = t.endColumn = input_stream.getBeginColumn();
-   }
-   else
-   {
-      String im = jjstrLiteralImages[jjmatchedKind];
-      t.image = (im == null) ? input_stream.GetImage() : im;
-      t.beginLine = input_stream.getBeginLine();
-      t.beginColumn = input_stream.getBeginColumn();
-      t.endLine = input_stream.getEndLine();
-      t.endColumn = input_stream.getEndColumn();
-   }
-   return t;
-}
-
-int curLexState = 0;
-int defaultLexState = 0;
-int jjnewStateCnt;
-int jjround;
-int jjmatchedPos;
-int jjmatchedKind;
-
-public Token getNextToken() 
-{
-  int kind;
-  Token specialToken = null;
-  Token matchedToken;
-  int curPos = 0;
-
-  EOFLoop :
-  for (;;)
-  {   
-   try   
-   {     
-      curChar = input_stream.BeginToken();
-   }     
-   catch(java.io.IOException e)
-   {        
-      jjmatchedKind = 0;
-      matchedToken = jjFillToken();
-      matchedToken.specialToken = specialToken;
-      return matchedToken;
-   }
-   image = null;
-   jjimageLen = 0;
-
-   for (;;)
-   {
-     switch(curLexState)
-     {
-       case 0:
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_0();
-         break;
-       case 1:
-         jjmatchedKind = 5;
-         jjmatchedPos = -1;
-         curPos = 0;
-         curPos = jjMoveStringLiteralDfa0_1();
-         if (jjmatchedPos < 0 || (jjmatchedPos == 0 && jjmatchedKind > 7))
-         {
-            jjmatchedKind = 7;
-            jjmatchedPos = 0;
-         }
-         break;
-       case 2:
-         jjmatchedKind = 0x7fffffff;
-         jjmatchedPos = 0;
-         curPos = jjMoveStringLiteralDfa0_2();
-         if (jjmatchedPos == 0 && jjmatchedKind > 7)
-         {
-            jjmatchedKind = 7;
-         }
-         break;
-     }
-     if (jjmatchedKind != 0x7fffffff)
-     {
-        if (jjmatchedPos + 1 < curPos)
-           input_stream.backup(curPos - jjmatchedPos - 1);
-        if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-        {
-           matchedToken = jjFillToken();
-           matchedToken.specialToken = specialToken;
-           TokenLexicalActions(matchedToken);
-       if (jjnewLexState[jjmatchedKind] != -1)
-         curLexState = jjnewLexState[jjmatchedKind];
-           return matchedToken;
-        }
-        else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-        {
-           if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
-           {
-              matchedToken = jjFillToken();
-              if (specialToken == null)
-                 specialToken = matchedToken;
-              else
-              {
-                 matchedToken.specialToken = specialToken;
-                 specialToken = (specialToken.next = matchedToken);
-              }
-              SkipLexicalActions(matchedToken);
-           }
-           else 
-              SkipLexicalActions(null);
-         if (jjnewLexState[jjmatchedKind] != -1)
-           curLexState = jjnewLexState[jjmatchedKind];
-           continue EOFLoop;
-        }
-        jjimageLen += jjmatchedPos + 1;
-      if (jjnewLexState[jjmatchedKind] != -1)
-        curLexState = jjnewLexState[jjmatchedKind];
-        curPos = 0;
-        jjmatchedKind = 0x7fffffff;
-        try {
-           curChar = input_stream.readChar();
-           continue;
-        }
-        catch (java.io.IOException e1) { }
-     }
-     int error_line = input_stream.getEndLine();
-     int error_column = input_stream.getEndColumn();
-     String error_after = null;
-     boolean EOFSeen = false;
-     try { input_stream.readChar(); input_stream.backup(1); }
-     catch (java.io.IOException e1) {
-        EOFSeen = true;
-        error_after = curPos <= 1 ? "" : input_stream.GetImage();
-        if (curChar == '\n' || curChar == '\r') {
-           error_line++;
-           error_column = 0;
-        }
-        else
-           error_column++;
-     }
-     if (!EOFSeen) {
-        input_stream.backup(1);
-        error_after = curPos <= 1 ? "" : input_stream.GetImage();
-     }
-     throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
-   }
-  }
-}
-
-void SkipLexicalActions(Token matchedToken)
-{
-   switch(jjmatchedKind)
-   {
-      default :
-         break;
-   }
-}
-void TokenLexicalActions(Token matchedToken)
-{
-   switch(jjmatchedKind)
-   {
-      case 77 :
-        if (image == null)
-            image = new StringBuffer();
-            image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
-           try {
-                // Peek at the next character.
-                char nextCh = input_stream.readChar();
-                input_stream.backup(1);
-                if (isRegValid == false || nextCh == '/' || nextCh == '*') {
-                    //
-                    // Lexecal analyser thinks it is a RE
-                    // operator such as /...../
-                    // Put the everything to the first "/" back on the input stream
-                    //
-                    input_stream.backup(lengthOfMatch-1);
-                    //
-                    // And remove it from the token
-                    //
-                    matchedToken.image = matchedToken.image.substring(0, 1);
-                    image.delete(0, image.length() - 1);
-                    image.append('/');
-                    matchedToken.kind=SLASH;
-                }
-               } catch (IOException e) {
-                    throw new Error(e.toString());
-               }
-         break;
-      default : 
-         break;
-   }
-}
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JSParser20TreeConstants.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JSParser20TreeConstants.java
deleted file mode 100644
index 17e4012..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JSParser20TreeConstants.java
+++ /dev/null
@@ -1,303 +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.
- */
-/* Generated By:JJTree: Do not edit this line. .\JSParser20TreeConstants.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public interface JSParser20TreeConstants
-{
-  public int JJTPROGRAM = 0;
-  public int JJTIDENTIFIER = 1;
-  public int JJTSIMPLEQUALIFIEDIDENTIFIER = 2;
-  public int JJTEXPRESSIONQUALIFIEDIDENTIFIER = 3;
-  public int JJTQUALIFIEDIDENTIFIER = 4;
-  public int JJTPRIMARYEXPRESSION = 5;
-  public int JJTRESERVEDNAMESPACE = 6;
-  public int JJTFUNCTIONEXPRESSION = 7;
-  public int JJTOBJECTLITERAL = 8;
-  public int JJTFIELDLIST = 9;
-  public int JJTLITERALFIELD = 10;
-  public int JJTFIELDNAME = 11;
-  public int JJTARRAYLITERAL = 12;
-  public int JJTELEMENTLIST = 13;
-  public int JJTLITERALELEMENT = 14;
-  public int JJTSUPEREXPRESSION = 15;
-  public int JJTPOSTFIXEXPRESSION = 16;
-  public int JJTATTRIBUTEEXPRESSION = 17;
-  public int JJTFULLPOSTFIXEXPRESSION = 18;
-  public int JJTFULLNEWEXPRESSION = 19;
-  public int JJTFUNCTIONCONSTRUCTOR = 20;
-  public int JJTFULLNEWSUBEXPRESSION = 21;
-  public int JJTPOSTFIXOP = 22;
-  public int JJTPROPERTYORARGUMENTS = 23;
-  public int JJTPROPERTYOPERATOR = 24;
-  public int JJTARGUMENTS = 25;
-  public int JJTUNARYEXPRESSION = 26;
-  public int JJTMULOP = 27;
-  public int JJTMULTIPLICATIVEEXPRESSION = 28;
-  public int JJTADDOP = 29;
-  public int JJTADDITIVEEXPRESSION = 30;
-  public int JJTSHIFTOP = 31;
-  public int JJTSHIFTEXPRESSION = 32;
-  public int JJTRELOP = 33;
-  public int JJTRELATIONALEXPRESSION = 34;
-  public int JJTRELATIONALEXPRESSIONNOIN = 35;
-  public int JJTEQUALOP = 36;
-  public int JJTEQUALITYEXPRESSION = 37;
-  public int JJTEQUALITYEXPRESSIONNOIN = 38;
-  public int JJTBITWISEANDOP = 39;
-  public int JJTBITWISEANDEXPRESSION = 40;
-  public int JJTBITWISEANDEXPRESSIONNOIN = 41;
-  public int JJTBITWISEXOROP = 42;
-  public int JJTBITWISEXOREXPRESSION = 43;
-  public int JJTBITWISEXOREXPRESSIONNOIN = 44;
-  public int JJTBITWISEOROP = 45;
-  public int JJTBITWISEOREXPRESSION = 46;
-  public int JJTBITWISEOREXPRESSIONNOIN = 47;
-  public int JJTLOGICALANDEXPRESSION = 48;
-  public int JJTLOGICALANDEXPRESSIONNOIN = 49;
-  public int JJTLOGICALOREXPRESSION = 50;
-  public int JJTLOGICALOREXPRESSIONNOIN = 51;
-  public int JJTCONDITIONALEXPRESSION = 52;
-  public int JJTCONDITIONALEXPRESSIONNOIN = 53;
-  public int JJTNONASSIGNMENTEXPRESSION = 54;
-  public int JJTNONASSIGNMENTEXPRESSIONNOIN = 55;
-  public int JJTASSIGNEMENTOPERATOR = 56;
-  public int JJTASSIGNMENTEXPRESSION = 57;
-  public int JJTASSIGNMENTEXPRESSIONNOIN = 58;
-  public int JJTLISTEXPRESSION = 59;
-  public int JJTLISTEXPRESSIONNOIN = 60;
-  public int JJTTYPEEXPRESSION = 61;
-  public int JJTTYPEEXPRESSIONNOIN = 62;
-  public int JJTTYPEEXPRESSIONLIST = 63;
-  public int JJTSTATEMENT = 64;
-  public int JJTSUBSTATEMENT = 65;
-  public int JJTSUBSTATEMENTS = 66;
-  public int JJTSC = 67;
-  public int JJTEOLCOMMENTSKIPWS = 68;
-  public int JJTEMPTYSTATEMENT = 69;
-  public int JJTEXPRESSIONSTATEMENT = 70;
-  public int JJTSUPERSTATEMENT = 71;
-  public int JJTBLOCK = 72;
-  public int JJTLABELEDSTATEMENT = 73;
-  public int JJTIFSTATEMENT = 74;
-  public int JJTSWITCHSTATEMENT = 75;
-  public int JJTCASEELEMENTS = 76;
-  public int JJTCASEELEMENT = 77;
-  public int JJTCASELABEL = 78;
-  public int JJTDOSTATEMENT = 79;
-  public int JJTWHILESTATEMENT = 80;
-  public int JJTFORSTATEMENT = 81;
-  public int JJTFORINITIALIZER = 82;
-  public int JJTFORINBINDING = 83;
-  public int JJTWITHSTATEMENT = 84;
-  public int JJTCONTINUESTATEMENT = 85;
-  public int JJTBREAKSTATEMENT = 86;
-  public int JJTRETURNSTATEMENT = 87;
-  public int JJTTHROWSTATEMENT = 88;
-  public int JJTTRYSTATEMENT = 89;
-  public int JJTDIRECTIVES = 90;
-  public int JJTDIRECTIVE = 91;
-  public int JJTANNOTATABLEDIRECTIVE = 92;
-  public int JJTATTRIBUTES = 93;
-  public int JJTATTRIBUTE = 94;
-  public int JJTUSEDIRECTIVE = 95;
-  public int JJTIMPORTDIRECTIVE = 96;
-  public int JJTINCLUDEDIRECTIVE = 97;
-  public int JJTPRAGMA = 98;
-  public int JJTPRAGMAITEMS = 99;
-  public int JJTPRAGMAITEM = 100;
-  public int JJTPRAGMAEXPR = 101;
-  public int JJTPRAGMAARGUMENT = 102;
-  public int JJTEXPORTDEFINITION = 103;
-  public int JJTEXPORTBINDINGLIST = 104;
-  public int JJTEXPORTBINDING = 105;
-  public int JJTVARIABLEDEFINITION = 106;
-  public int JJTVARIABLEDEFINITIONNOIN = 107;
-  public int JJTVARIABLEDEFINITIONKIND = 108;
-  public int JJTVARIABLEBINDINGLIST = 109;
-  public int JJTVARIABLEBINDINGLISTNOIN = 110;
-  public int JJTVARIABLEBINDING = 111;
-  public int JJTVARIABLEBINDINGNOIN = 112;
-  public int JJTVARIABLEINITIALISATION = 113;
-  public int JJTVARIABLEINITIALISATIONNOIN = 114;
-  public int JJTVARIABLEINITIALIZER = 115;
-  public int JJTVARIABLEINITIALIZERNOIN = 116;
-  public int JJTTYPEDIDENTIFIER = 117;
-  public int JJTTYPEDIDENTIFIERNOIN = 118;
-  public int JJTSIMPLEVARIABLEDEFINITION = 119;
-  public int JJTUNTYPEDVARIABLEBINDINGLIST = 120;
-  public int JJTUNTYPEDVARIABLEBINDING = 121;
-  public int JJTFUNCTIONDEFINITION = 122;
-  public int JJTFUNCTIONNAME = 123;
-  public int JJTFUNCTIONCOMMON = 124;
-  public int JJTPARAMETERS = 125;
-  public int JJTPARAMETER = 126;
-  public int JJTPARAMETERINIT = 127;
-  public int JJTRESTPARAMETERS = 128;
-  public int JJTRESULT = 129;
-  public int JJTCLASSDEFINITION = 130;
-  public int JJTINTERFACEDEFINITION = 131;
-  public int JJTINHERITANCE = 132;
-  public int JJTNAMESPACEDEFINITION = 133;
-  public int JJTPACKAGEDEFINITION = 134;
-  public int JJTPACKAGENAME = 135;
-  public int JJTPACKAGEIDENTIFIERS = 136;
-
-
-  public String[] jjtNodeName = {
-    "Program",
-    "Identifier",
-    "SimpleQualifiedIdentifier",
-    "ExpressionQualifiedIdentifier",
-    "QualifiedIdentifier",
-    "PrimaryExpression",
-    "ReservedNamespace",
-    "FunctionExpression",
-    "ObjectLiteral",
-    "FieldList",
-    "LiteralField",
-    "FieldName",
-    "ArrayLiteral",
-    "ElementList",
-    "LiteralElement",
-    "SuperExpression",
-    "PostfixExpression",
-    "AttributeExpression",
-    "FullPostfixExpression",
-    "FullNewExpression",
-    "FunctionConstructor",
-    "FullNewSubexpression",
-    "PostfixOp",
-    "PropertyOrArguments",
-    "PropertyOperator",
-    "Arguments",
-    "UnaryExpression",
-    "MulOp",
-    "MultiplicativeExpression",
-    "AddOp",
-    "AdditiveExpression",
-    "ShiftOp",
-    "ShiftExpression",
-    "RelOp",
-    "RelationalExpression",
-    "RelationalExpressionNoIN",
-    "EqualOp",
-    "EqualityExpression",
-    "EqualityExpressionNoIN",
-    "BitwiseANDOp",
-    "BitwiseANDExpression",
-    "BitwiseANDExpressionNoIN",
-    "BitwiseXOROp",
-    "BitwiseXORExpression",
-    "BitwiseXORExpressionNoIN",
-    "BitwiseOROp",
-    "BitwiseORExpression",
-    "BitwiseORExpressionNoIN",
-    "LogicalANDExpression",
-    "LogicalANDExpressionNoIN",
-    "LogicalORExpression",
-    "LogicalORExpressionNoIN",
-    "ConditionalExpression",
-    "ConditionalExpressionNoIN",
-    "NonAssignmentExpression",
-    "NonAssignmentExpressionNoIN",
-    "AssignementOperator",
-    "AssignmentExpression",
-    "AssignmentExpressionNoIN",
-    "ListExpression",
-    "ListExpressionNoIN",
-    "TypeExpression",
-    "TypeExpressionNoIN",
-    "TypeExpressionList",
-    "Statement",
-    "Substatement",
-    "Substatements",
-    "Sc",
-    "EolCommentSkipWs",
-    "EmptyStatement",
-    "ExpressionStatement",
-    "SuperStatement",
-    "Block",
-    "LabeledStatement",
-    "IfStatement",
-    "SwitchStatement",
-    "CaseElements",
-    "CaseElement",
-    "CaseLabel",
-    "DoStatement",
-    "WhileStatement",
-    "ForStatement",
-    "ForInitializer",
-    "ForInBinding",
-    "WithStatement",
-    "ContinueStatement",
-    "BreakStatement",
-    "ReturnStatement",
-    "ThrowStatement",
-    "TryStatement",
-    "Directives",
-    "Directive",
-    "AnnotatableDirective",
-    "Attributes",
-    "Attribute",
-    "UseDirective",
-    "ImportDirective",
-    "IncludeDirective",
-    "Pragma",
-    "PragmaItems",
-    "PragmaItem",
-    "PragmaExpr",
-    "PragmaArgument",
-    "ExportDefinition",
-    "ExportBindingList",
-    "ExportBinding",
-    "VariableDefinition",
-    "VariableDefinitionNoIN",
-    "VariableDefinitionKind",
-    "VariableBindingList",
-    "VariableBindingListNoIN",
-    "VariableBinding",
-    "VariableBindingNoIN",
-    "VariableInitialisation",
-    "VariableInitialisationNoIN",
-    "VariableInitializer",
-    "VariableInitializerNoIN",
-    "TypedIdentifier",
-    "TypedIdentifierNoIN",
-    "SimpleVariableDefinition",
-    "UntypedVariableBindingList",
-    "UntypedVariableBinding",
-    "FunctionDefinition",
-    "FunctionName",
-    "FunctionCommon",
-    "Parameters",
-    "Parameter",
-    "ParameterInit",
-    "RestParameters",
-    "Result",
-    "ClassDefinition",
-    "InterfaceDefinition",
-    "Inheritance",
-    "NamespaceDefinition",
-    "PackageDefinition",
-    "PackageName",
-    "PackageIdentifiers",
-  };
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JSParser20Visitor.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JSParser20Visitor.java
deleted file mode 100644
index a062d01..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/JSParser20Visitor.java
+++ /dev/null
@@ -1,163 +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.
- */
-/* Generated By:JJTree: Do not edit this line. .\JSParser20Visitor.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public interface JSParser20Visitor
-{
-  public Object visit(SimpleNode node, Object data);
-  public Object visit(ASTProgram node, Object data);
-  public Object visit(ASTIdentifier node, Object data);
-  public Object visit(ASTSimpleQualifiedIdentifier node, Object data);
-  public Object visit(ASTExpressionQualifiedIdentifier node, Object data);
-  public Object visit(ASTQualifiedIdentifier node, Object data);
-  public Object visit(ASTPrimaryExpression node, Object data);
-  public Object visit(ASTReservedNamespace node, Object data);
-  public Object visit(ASTFunctionExpression node, Object data);
-  public Object visit(ASTObjectLiteral node, Object data);
-  public Object visit(ASTFieldList node, Object data);
-  public Object visit(ASTLiteralField node, Object data);
-  public Object visit(ASTFieldName node, Object data);
-  public Object visit(ASTArrayLiteral node, Object data);
-  public Object visit(ASTElementList node, Object data);
-  public Object visit(ASTLiteralElement node, Object data);
-  public Object visit(ASTSuperExpression node, Object data);
-  public Object visit(ASTPostfixExpression node, Object data);
-  public Object visit(ASTAttributeExpression node, Object data);
-  public Object visit(ASTFullPostfixExpression node, Object data);
-  public Object visit(ASTFullNewExpression node, Object data);
-  public Object visit(ASTFunctionConstructor node, Object data);
-  public Object visit(ASTFullNewSubexpression node, Object data);
-  public Object visit(ASTPostfixOp node, Object data);
-  public Object visit(ASTPropertyOrArguments node, Object data);
-  public Object visit(ASTPropertyOperator node, Object data);
-  public Object visit(ASTArguments node, Object data);
-  public Object visit(ASTUnaryExpression node, Object data);
-  public Object visit(ASTMulOp node, Object data);
-  public Object visit(ASTMultiplicativeExpression node, Object data);
-  public Object visit(ASTAddOp node, Object data);
-  public Object visit(ASTAdditiveExpression node, Object data);
-  public Object visit(ASTShiftOp node, Object data);
-  public Object visit(ASTShiftExpression node, Object data);
-  public Object visit(ASTRelOp node, Object data);
-  public Object visit(ASTRelationalExpression node, Object data);
-  public Object visit(ASTRelationalExpressionNoIN node, Object data);
-  public Object visit(ASTEqualOp node, Object data);
-  public Object visit(ASTEqualityExpression node, Object data);
-  public Object visit(ASTEqualityExpressionNoIN node, Object data);
-  public Object visit(ASTBitwiseANDOp node, Object data);
-  public Object visit(ASTBitwiseANDExpression node, Object data);
-  public Object visit(ASTBitwiseANDExpressionNoIN node, Object data);
-  public Object visit(ASTBitwiseXOROp node, Object data);
-  public Object visit(ASTBitwiseXORExpression node, Object data);
-  public Object visit(ASTBitwiseXORExpressionNoIN node, Object data);
-  public Object visit(ASTBitwiseOROp node, Object data);
-  public Object visit(ASTBitwiseORExpression node, Object data);
-  public Object visit(ASTBitwiseORExpressionNoIN node, Object data);
-  public Object visit(ASTLogicalANDExpression node, Object data);
-  public Object visit(ASTLogicalANDExpressionNoIN node, Object data);
-  public Object visit(ASTLogicalORExpression node, Object data);
-  public Object visit(ASTLogicalORExpressionNoIN node, Object data);
-  public Object visit(ASTConditionalExpression node, Object data);
-  public Object visit(ASTConditionalExpressionNoIN node, Object data);
-  public Object visit(ASTNonAssignmentExpression node, Object data);
-  public Object visit(ASTNonAssignmentExpressionNoIN node, Object data);
-  public Object visit(ASTAssignementOperator node, Object data);
-  public Object visit(ASTAssignmentExpression node, Object data);
-  public Object visit(ASTAssignmentExpressionNoIN node, Object data);
-  public Object visit(ASTListExpression node, Object data);
-  public Object visit(ASTListExpressionNoIN node, Object data);
-  public Object visit(ASTTypeExpression node, Object data);
-  public Object visit(ASTTypeExpressionNoIN node, Object data);
-  public Object visit(ASTTypeExpressionList node, Object data);
-  public Object visit(ASTStatement node, Object data);
-  public Object visit(ASTSubstatement node, Object data);
-  public Object visit(ASTSubstatements node, Object data);
-  public Object visit(ASTSc node, Object data);
-  public Object visit(ASTEolCommentSkipWs node, Object data);
-  public Object visit(ASTEmptyStatement node, Object data);
-  public Object visit(ASTExpressionStatement node, Object data);
-  public Object visit(ASTSuperStatement node, Object data);
-  public Object visit(ASTBlock node, Object data);
-  public Object visit(ASTLabeledStatement node, Object data);
-  public Object visit(ASTIfStatement node, Object data);
-  public Object visit(ASTSwitchStatement node, Object data);
-  public Object visit(ASTCaseElements node, Object data);
-  public Object visit(ASTCaseElement node, Object data);
-  public Object visit(ASTCaseLabel node, Object data);
-  public Object visit(ASTDoStatement node, Object data);
-  public Object visit(ASTWhileStatement node, Object data);
-  public Object visit(ASTForStatement node, Object data);
-  public Object visit(ASTForInitializer node, Object data);
-  public Object visit(ASTForInBinding node, Object data);
-  public Object visit(ASTWithStatement node, Object data);
-  public Object visit(ASTContinueStatement node, Object data);
-  public Object visit(ASTBreakStatement node, Object data);
-  public Object visit(ASTReturnStatement node, Object data);
-  public Object visit(ASTThrowStatement node, Object data);
-  public Object visit(ASTTryStatement node, Object data);
-  public Object visit(ASTDirectives node, Object data);
-  public Object visit(ASTDirective node, Object data);
-  public Object visit(ASTAnnotatableDirective node, Object data);
-  public Object visit(ASTAttributes node, Object data);
-  public Object visit(ASTAttribute node, Object data);
-  public Object visit(ASTUseDirective node, Object data);
-  public Object visit(ASTImportDirective node, Object data);
-  public Object visit(ASTIncludeDirective node, Object data);
-  public Object visit(ASTPragma node, Object data);
-  public Object visit(ASTPragmaItems node, Object data);
-  public Object visit(ASTPragmaItem node, Object data);
-  public Object visit(ASTPragmaExpr node, Object data);
-  public Object visit(ASTPragmaArgument node, Object data);
-  public Object visit(ASTExportDefinition node, Object data);
-  public Object visit(ASTExportBindingList node, Object data);
-  public Object visit(ASTExportBinding node, Object data);
-  public Object visit(ASTVariableDefinition node, Object data);
-  public Object visit(ASTVariableDefinitionNoIN node, Object data);
-  public Object visit(ASTVariableDefinitionKind node, Object data);
-  public Object visit(ASTVariableBindingList node, Object data);
-  public Object visit(ASTVariableBindingListNoIN node, Object data);
-  public Object visit(ASTVariableBinding node, Object data);
-  public Object visit(ASTVariableBindingNoIN node, Object data);
-  public Object visit(ASTVariableInitialisation node, Object data);
-  public Object visit(ASTVariableInitialisationNoIN node, Object data);
-  public Object visit(ASTVariableInitializer node, Object data);
-  public Object visit(ASTVariableInitializerNoIN node, Object data);
-  public Object visit(ASTTypedIdentifier node, Object data);
-  public Object visit(ASTTypedIdentifierNoIN node, Object data);
-  public Object visit(ASTSimpleVariableDefinition node, Object data);
-  public Object visit(ASTUntypedVariableBindingList node, Object data);
-  public Object visit(ASTUntypedVariableBinding node, Object data);
-  public Object visit(ASTFunctionDefinition node, Object data);
-  public Object visit(ASTFunctionName node, Object data);
-  public Object visit(ASTFunctionCommon node, Object data);
-  public Object visit(ASTParameters node, Object data);
-  public Object visit(ASTParameter node, Object data);
-  public Object visit(ASTParameterInit node, Object data);
-  public Object visit(ASTRestParameters node, Object data);
-  public Object visit(ASTResult node, Object data);
-  public Object visit(ASTClassDefinition node, Object data);
-  public Object visit(ASTInterfaceDefinition node, Object data);
-  public Object visit(ASTInheritance node, Object data);
-  public Object visit(ASTNamespaceDefinition node, Object data);
-  public Object visit(ASTPackageDefinition node, Object data);
-  public Object visit(ASTPackageName node, Object data);
-  public Object visit(ASTPackageIdentifiers node, Object data);
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/Node.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/Node.java
deleted file mode 100644
index c33ea2b..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/Node.java
+++ /dev/null
@@ -1,57 +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.
- */
-/* Generated By:JJTree: Do not edit this line. Node.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-/* All AST nodes must implement this interface.  It provides basic
-   machinery for constructing the parent and child relationships
-   between nodes. */
-
-public interface Node
-{
-
-  /** This method is called after the node has been made the current
-    node.  It indicates that child nodes can now be added to it. */
-  public void jjtOpen();
-
-  /** This method is called after all the child nodes have been
-    added. */
-  public void jjtClose();
-
-  /** This pair of methods are used to inform the node of its
-    parent. */
-  public void jjtSetParent(Node n);
-
-  public Node jjtGetParent();
-
-  /** This method tells the node to add its argument to the node's
-    list of children.  */
-  public void jjtAddChild(Node n, int i);
-
-  /** This method returns a child node.  The children are numbered
-     from zero, left to right. */
-  public Node jjtGetChild(int i);
-
-  /** Return the number of children the node has. */
-  public int jjtGetNumChildren();
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data);
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ParseException.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ParseException.java
deleted file mode 100644
index 3be8d5b..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/ParseException.java
+++ /dev/null
@@ -1,292 +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.
- */
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-/**
- * This exception is thrown when parse errors are encountered.
- * You can explicitly create objects of this exception type by
- * calling the method generateParseException in the generated
- * parser.
- *
- * You can modify this class to customize your error reporting
- * mechanisms so long as you retain the public fields.
- */
-public class ParseException extends Exception
-{
-
-  /**
-   * This variable determines which constructor was used to create
-   * this object and thereby affects the semantics of the
-   * "getMessage" method (see below).
-   */
-  protected boolean specialConstructor;
-
-  /**
-   * This is the last token that has been consumed successfully.  If
-   * this object has been created due to a parse error, the token
-   * followng this token will (therefore) be the first error token.
-   */
-  public Token currentToken;
-
-  /**
-   * Each entry in this array is an array of integers.  Each array
-   * of integers represents a sequence of tokens (by their ordinal
-   * values) that is expected at this point of the parse.
-   */
-  public int[][] expectedTokenSequences;
-
-  /**
-   * This is a reference to the "tokenImage" array of the generated
-   * parser within which the parse error occurred.  This array is
-   * defined in the generated ...Constants interface.
-   */
-  public String[] tokenImage;
-
-  /**
-   * The end of line string for this machine.
-   */
-  protected String eol = System.getProperty("line.separator", "\n");
-
-  /**
-   * This constructor is used by the method "generateParseException"
-   * in the generated parser.  Calling this constructor generates
-   * a new object of this type with the fields "currentToken",
-   * "expectedTokenSequences", and "tokenImage" set.  The boolean
-   * flag "specialConstructor" is also set to true to indicate that
-   * this constructor was used to create this object.
-   * This constructor calls its super class with the empty string
-   * to force the "toString" method of parent class "Throwable" to
-   * print the error message in the form:
-   *     ParseException: <result of getMessage>
-   */
-  public ParseException(Token    currentTokenVal,
-                        int[][]  expectedTokenSequencesVal,
-                        String[] tokenImageVal)
-  {
-    super("");
-    specialConstructor = true;
-    currentToken = currentTokenVal;
-    expectedTokenSequences = expectedTokenSequencesVal;
-    tokenImage = tokenImageVal;
-  }
-
-  /**
-   * The following constructors are for use by you for whatever
-   * purpose you can think of.  Constructing the exception in this
-   * manner makes the exception behave in the normal way - i.e., as
-   * documented in the class "Throwable".  The fields "errorToken",
-   * "expectedTokenSequences", and "tokenImage" do not contain
-   * relevant information.  The JavaCC generated code does not use
-   * these constructors.
-   */
-
-  public ParseException()
-  {
-    super();
-    specialConstructor = false;
-  }
-
-  public ParseException(String message)
-  {
-    super(message);
-    specialConstructor = false;
-  }
-
-  /**
-   * This method has the standard behavior when this object has been
-   * created using the standard constructors.  Otherwise, it uses
-   * "currentToken" and "expectedTokenSequences" to generate a parse
-   * error message and returns it.  If this object has been created
-   * due to a parse error, and you do not catch it (it gets thrown
-   * from the parser), then this method is called during the printing
-   * of the final stack trace, and hence the correct error message
-   * gets displayed.
-   */
-  public String getMessage()
-  {
-
-    if (!specialConstructor)
-    {
-      return super.getMessage();
-    }
-
-    String expected = "";
-    int    maxSize = 0;
-
-    for (int i = 0; i < expectedTokenSequences.length; i++)
-    {
-
-      if (maxSize < expectedTokenSequences[i].length)
-      {
-        maxSize = expectedTokenSequences[i].length;
-      }
-
-      for (int j = 0; j < expectedTokenSequences[i].length; j++)
-      {
-        expected += tokenImage[expectedTokenSequences[i][j]] + " ";
-      }
-
-      if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0)
-      {
-        expected += "...";
-      }
-
-      expected += eol + "    ";
-    }
-
-    String retval = "Encountered \"";
-    Token  tok = currentToken.next;
-
-    for (int i = 0; i < maxSize; i++)
-    {
-
-      if (i != 0)
-      {
-        retval += " ";
-      }
-
-      if (tok.kind == 0)
-      {
-        retval += tokenImage[0];
-
-        break;
-      }
-
-      retval += add_escapes(tok.image);
-      tok = tok.next;
-    }
-
-    retval += "\" at line " + currentToken.next.beginLine + ", column " +
-      currentToken.next.beginColumn;
-    retval += "." + eol;
-
-    if (expectedTokenSequences.length == 1)
-    {
-      retval += "Was expecting:" + eol + "    ";
-    }
-    else
-    {
-      retval += "Was expecting one of:" + eol + "    ";
-    }
-
-    retval += expected;
-
-    return retval;
-  }
-
-  /**
-   * Used to convert raw characters to their escaped version
-   * when these raw version cannot be used as part of an ASCII
-   * string literal.
-   */
-  protected String add_escapes(String str)
-  {
-    StringBuffer retval = new StringBuffer();
-    char         ch;
-
-    for (int i = 0; i < str.length(); i++)
-    {
-
-      switch (str.charAt(i))
-      {
-
-      case 0:
-      {
-        continue;
-      }
-
-      case '\b':
-      {
-        retval.append("\\b");
-
-        continue;
-      }
-
-      case '\t':
-      {
-        retval.append("\\t");
-
-        continue;
-      }
-
-      case '\n':
-      {
-        retval.append("\\n");
-
-        continue;
-      }
-
-      case '\f':
-      {
-        retval.append("\\f");
-
-        continue;
-      }
-
-      case '\r':
-      {
-        retval.append("\\r");
-
-        continue;
-      }
-
-      case '\"':
-      {
-        retval.append("\\\"");
-
-        continue;
-      }
-
-      case '\'':
-      {
-        retval.append("\\\'");
-
-        continue;
-      }
-
-      case '\\':
-      {
-        retval.append("\\\\");
-
-        continue;
-      }
-
-      default:
-      {
-
-        if (((ch = str.charAt(i)) < 0x20) || (ch > 0x7e))
-        {
-          String s = "0000" + Integer.toString(ch, 16);
-          retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-        }
-        else
-        {
-          retval.append(ch);
-        }
-
-        continue;
-      }
-      }
-    }
-
-    return retval.toString();
-  }
-
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/SimpleCharStream.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/SimpleCharStream.java
deleted file mode 100644
index dbb7e01..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/SimpleCharStream.java
+++ /dev/null
@@ -1,559 +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.
- */
-/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-/**
- * An implementation of interface CharStream, where the stream is assumed to
- * contain only ASCII characters (without unicode processing).
- */
-
-public class SimpleCharStream
-{
-  public static final boolean staticFlag = false;
-  int                         bufsize;
-  int                         available;
-  int                         tokenBegin;
-  public int                  bufpos = -1;
-  protected int[]             bufline;
-  protected int[]             bufcolumn;
-
-  protected int column = 0;
-  protected int line = 1;
-
-  protected boolean prevCharIsCR = false;
-  protected boolean prevCharIsLF = false;
-
-  protected java.io.Reader inputStream;
-
-  protected char[] buffer;
-  protected int    maxNextCharInd = 0;
-  protected int    inBuf = 0;
-  protected int    tabSize = 8;
-
-  public SimpleCharStream(java.io.Reader dstream, int startline,
-                          int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    available = bufsize = buffersize;
-    buffer = new char[buffersize];
-    bufline = new int[buffersize];
-    bufcolumn = new int[buffersize];
-  }
-
-  public SimpleCharStream(java.io.Reader dstream, int startline,
-                          int startcolumn)
-  {
-    this(dstream, startline, startcolumn, 4096);
-  }
-
-  public SimpleCharStream(java.io.Reader dstream)
-  {
-    this(dstream, 1, 1, 4096);
-  }
-
-  public SimpleCharStream(java.io.InputStream dstream, String encoding,
-                          int startline, int startcolumn, int buffersize)
-                   throws java.io.UnsupportedEncodingException
-  {
-    this((encoding == null) ? new java.io.InputStreamReader(dstream)
-                            : new java.io.InputStreamReader(dstream, encoding),
-         startline, startcolumn, buffersize);
-  }
-
-  public SimpleCharStream(java.io.InputStream dstream, int startline,
-                          int startcolumn, int buffersize)
-  {
-    this(new java.io.InputStreamReader(dstream), startline, startcolumn,
-         buffersize);
-  }
-
-  public SimpleCharStream(java.io.InputStream dstream, String encoding,
-                          int startline, int startcolumn)
-                   throws java.io.UnsupportedEncodingException
-  {
-    this(dstream, encoding, startline, startcolumn, 4096);
-  }
-
-  public SimpleCharStream(java.io.InputStream dstream, int startline,
-                          int startcolumn)
-  {
-    this(dstream, startline, startcolumn, 4096);
-  }
-
-  public SimpleCharStream(java.io.InputStream dstream, String encoding)
-                   throws java.io.UnsupportedEncodingException
-  {
-    this(dstream, encoding, 1, 1, 4096);
-  }
-
-  public SimpleCharStream(java.io.InputStream dstream)
-  {
-    this(dstream, 1, 1, 4096);
-  }
-
-  protected void setTabSize(int i)
-  {
-    tabSize = i;
-  }
-
-  protected int getTabSize(int i)
-  {
-    return tabSize;
-  }
-
-
-  protected void ExpandBuff(boolean wrapAround)
-  {
-    char[] newbuffer = new char[bufsize + 2048];
-    int[]  newbufline = new int[bufsize + 2048];
-    int[]  newbufcolumn = new int[bufsize + 2048];
-
-    try
-    {
-
-      if (wrapAround)
-      {
-        System.arraycopy(buffer, tokenBegin, newbuffer, 0,
-                         bufsize - tokenBegin);
-        System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos);
-        buffer = newbuffer;
-
-        System.arraycopy(bufline, tokenBegin, newbufline, 0,
-                         bufsize - tokenBegin);
-        System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
-        bufline = newbufline;
-
-        System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0,
-                         bufsize - tokenBegin);
-        System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin,
-                         bufpos);
-        bufcolumn = newbufcolumn;
-
-        maxNextCharInd = (bufpos += (bufsize - tokenBegin));
-      }
-      else
-      {
-        System.arraycopy(buffer, tokenBegin, newbuffer, 0,
-                         bufsize - tokenBegin);
-        buffer = newbuffer;
-
-        System.arraycopy(bufline, tokenBegin, newbufline, 0,
-                         bufsize - tokenBegin);
-        bufline = newbufline;
-
-        System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0,
-                         bufsize - tokenBegin);
-        bufcolumn = newbufcolumn;
-
-        maxNextCharInd = (bufpos -= tokenBegin);
-      }
-    }
-    catch (Throwable t)
-    {
-      throw new Error(t.getMessage());
-    }
-
-    bufsize += 2048;
-    available = bufsize;
-    tokenBegin = 0;
-  }
-
-  protected void FillBuff() throws java.io.IOException
-  {
-
-    if (maxNextCharInd == available)
-    {
-
-      if (available == bufsize)
-      {
-
-        if (tokenBegin > 2048)
-        {
-          bufpos = maxNextCharInd = 0;
-          available = tokenBegin;
-        }
-        else if (tokenBegin < 0)
-        {
-          bufpos = maxNextCharInd = 0;
-        }
-        else
-        {
-          ExpandBuff(false);
-        }
-      }
-      else if (available > tokenBegin)
-      {
-        available = bufsize;
-      }
-      else if ((tokenBegin - available) < 2048)
-      {
-        ExpandBuff(true);
-      }
-      else
-      {
-        available = tokenBegin;
-      }
-    }
-
-    int i;
-
-    try
-    {
-
-      if ((i = inputStream.read(buffer, maxNextCharInd,
-                                  available - maxNextCharInd)) == -1)
-      {
-        inputStream.close();
-        throw new java.io.IOException();
-      }
-      else
-      {
-        maxNextCharInd += i;
-      }
-
-      return;
-    }
-    catch (java.io.IOException e)
-    {
-      --bufpos;
-      backup(0);
-
-      if (tokenBegin == -1)
-      {
-        tokenBegin = bufpos;
-      }
-
-      throw e;
-    }
-  }
-
-  public char BeginToken() throws java.io.IOException
-  {
-    tokenBegin = -1;
-
-    char c = readChar();
-    tokenBegin = bufpos;
-
-    return c;
-  }
-
-  protected void UpdateLineColumn(char c)
-  {
-    column++;
-
-    if (prevCharIsLF)
-    {
-      prevCharIsLF = false;
-      line += (column = 1);
-    }
-    else if (prevCharIsCR)
-    {
-      prevCharIsCR = false;
-
-      if (c == '\n')
-      {
-        prevCharIsLF = true;
-      }
-      else
-      {
-        line += (column = 1);
-      }
-    }
-
-    switch (c)
-    {
-
-    case '\r':
-    {
-      prevCharIsCR = true;
-
-      break;
-    }
-
-    case '\n':
-    {
-      prevCharIsLF = true;
-
-      break;
-    }
-
-    case '\t':
-    {
-      column--;
-      column += (tabSize - (column % tabSize));
-
-      break;
-    }
-
-    default:
-    {
-      break;
-    }
-    }
-
-    bufline[bufpos] = line;
-    bufcolumn[bufpos] = column;
-  }
-
-  public char readChar() throws java.io.IOException
-  {
-
-    if (inBuf > 0)
-    {
-      --inBuf;
-
-      if (++bufpos == bufsize)
-      {
-        bufpos = 0;
-      }
-
-      return buffer[bufpos];
-    }
-
-    if (++bufpos >= maxNextCharInd)
-    {
-      FillBuff();
-    }
-
-    char c = buffer[bufpos];
-
-    UpdateLineColumn(c);
-
-    return (c);
-  }
-
-  /**
-   * @deprecated
-   * @see #getEndColumn
-   */
-
-  public int getColumn()
-  {
-    return bufcolumn[bufpos];
-  }
-
-  /**
-   * @deprecated
-   * @see #getEndLine
-   */
-
-  public int getLine()
-  {
-    return bufline[bufpos];
-  }
-
-  public int getEndColumn()
-  {
-    return bufcolumn[bufpos];
-  }
-
-  public int getEndLine()
-  {
-    return bufline[bufpos];
-  }
-
-  public int getBeginColumn()
-  {
-    return bufcolumn[tokenBegin];
-  }
-
-  public int getBeginLine()
-  {
-    return bufline[tokenBegin];
-  }
-
-  public void backup(int amount)
-  {
-
-    inBuf += amount;
-
-    if ((bufpos -= amount) < 0)
-    {
-      bufpos += bufsize;
-    }
-  }
-
-  public void ReInit(java.io.Reader dstream, int startline, int startcolumn,
-                     int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    if ((buffer == null) || (buffersize != buffer.length))
-    {
-      available = bufsize = buffersize;
-      buffer = new char[buffersize];
-      bufline = new int[buffersize];
-      bufcolumn = new int[buffersize];
-    }
-
-    prevCharIsLF = prevCharIsCR = false;
-    tokenBegin = inBuf = maxNextCharInd = 0;
-    bufpos = -1;
-  }
-
-  public void ReInit(java.io.Reader dstream, int startline, int startcolumn)
-  {
-    ReInit(dstream, startline, startcolumn, 4096);
-  }
-
-  public void ReInit(java.io.Reader dstream)
-  {
-    ReInit(dstream, 1, 1, 4096);
-  }
-
-  public void ReInit(java.io.InputStream dstream, String encoding,
-                     int startline, int startcolumn, int buffersize)
-              throws java.io.UnsupportedEncodingException
-  {
-    ReInit((encoding == null)
-           ? new java.io.InputStreamReader(dstream)
-           : new java.io.InputStreamReader(dstream, encoding), startline,
-           startcolumn, buffersize);
-  }
-
-  public void ReInit(java.io.InputStream dstream, int startline,
-                     int startcolumn, int buffersize)
-  {
-    ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn,
-           buffersize);
-  }
-
-  public void ReInit(java.io.InputStream dstream, String encoding)
-              throws java.io.UnsupportedEncodingException
-  {
-    ReInit(dstream, encoding, 1, 1, 4096);
-  }
-
-  public void ReInit(java.io.InputStream dstream)
-  {
-    ReInit(dstream, 1, 1, 4096);
-  }
-
-  public void ReInit(java.io.InputStream dstream, String encoding,
-                     int startline, int startcolumn)
-              throws java.io.UnsupportedEncodingException
-  {
-    ReInit(dstream, encoding, startline, startcolumn, 4096);
-  }
-
-  public void ReInit(java.io.InputStream dstream, int startline,
-                     int startcolumn)
-  {
-    ReInit(dstream, startline, startcolumn, 4096);
-  }
-
-  public String GetImage()
-  {
-
-    if (bufpos >= tokenBegin)
-    {
-      return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
-    }
-    else
-    {
-      return new String(buffer, tokenBegin, bufsize - tokenBegin) +
-        new String(buffer, 0, bufpos + 1);
-    }
-  }
-
-  public char[] GetSuffix(int len)
-  {
-    char[] ret = new char[len];
-
-    if ((bufpos + 1) >= len)
-    {
-      System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
-    }
-    else
-    {
-      System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
-                       len - bufpos - 1);
-      System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
-    }
-
-    return ret;
-  }
-
-  public void Done()
-  {
-    buffer = null;
-    bufline = null;
-    bufcolumn = null;
-  }
-
-  /**
-   * Method to adjust line and column numbers for the start of a token.
-   */
-  public void adjustBeginLineColumn(int newLine, int newCol)
-  {
-    int start = tokenBegin;
-    int len;
-
-    if (bufpos >= tokenBegin)
-    {
-      len = bufpos - tokenBegin + inBuf + 1;
-    }
-    else
-    {
-      len = bufsize - tokenBegin + bufpos + 1 + inBuf;
-    }
-
-    int i = 0, j = 0, k = 0;
-    int nextColDiff = 0, columnDiff = 0;
-
-    while ((i < len) &&
-        (bufline[j = start % bufsize] == bufline[k = ++start % bufsize]))
-    {
-      bufline[j] = newLine;
-      nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
-      bufcolumn[j] = newCol + columnDiff;
-      columnDiff = nextColDiff;
-      i++;
-    }
-
-    if (i < len)
-    {
-      bufline[j] = newLine++;
-      bufcolumn[j] = newCol + columnDiff;
-
-      while (i++ < len)
-      {
-
-        if (bufline[j = start % bufsize] != bufline[++start % bufsize])
-        {
-          bufline[j] = newLine++;
-        }
-        else
-        {
-          bufline[j] = newLine;
-        }
-      }
-    }
-
-    line = bufline[j];
-    column = bufcolumn[j];
-  }
-
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/SimpleNode.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/SimpleNode.java
deleted file mode 100644
index 09cee93..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/SimpleNode.java
+++ /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.
- */
-/* Generated By:JJTree: Do not edit this line. SimpleNode.java */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class SimpleNode implements Node
-{
-  protected Node       parent;
-  protected Node[]     children;
-  protected int        id;
-  protected JSParser20 parser;
-
-  protected Token      first;
-  protected Token      last;
-
-  public SimpleNode(int i)
-  {
-    id = i;
-  }
-
-  public SimpleNode(JSParser20 p, int i)
-  {
-    this(i);
-    parser = p;
-  }
-
-  public void jjtOpen()
-  {
-    first = parser.getToken(1); // new
-  }
-
-  public void jjtClose()
-  {
-    last = parser.getToken(0); // new
-  }
-
-  public Token getFirstToken() { return first; } // new
-  public Token getLastToken() { return last; }   // new
-
-  public void jjtSetParent(Node n)
-  {
-    parent = n;
-  }
-
-  public Node jjtGetParent()
-  {
-    return parent;
-  }
-
-  public void jjtAddChild(Node n, int i)
-  {
-
-    if (children == null)
-    {
-      children = new Node[i + 1];
-    }
-    else if (i >= children.length)
-    {
-      Node[] c = new Node[i + 1];
-      System.arraycopy(children, 0, c, 0, children.length);
-      children = c;
-    }
-
-    children[i] = n;
-  }
-
-  public Node jjtGetChild(int i)
-  {
-    return children[i];
-  }
-
-  public int jjtGetNumChildren()
-  {
-    return (children == null) ? 0 : children.length;
-  }
-
-  /** Accept the visitor. **/
-  public Object jjtAccept(JSParser20Visitor visitor, Object data)
-  {
-    return visitor.visit(this, data);
-  }
-
-  /** Accept the visitor. **/
-  public Object childrenAccept(JSParser20Visitor visitor, Object data)
-  {
-
-    if (children != null)
-    {
-
-      for (int i = 0; i < children.length; ++i)
-      {
-        children[i].jjtAccept(visitor, data);
-      }
-    }
-
-    return data;
-  }
-
-  /* You can override these two methods in subclasses of SimpleNode to
-     customize the way the node appears when the tree is dumped.  If
-     your output uses more than one line you should override
-     toString(String), otherwise overriding toString() is probably all
-     you need to do. */
-
-  public String toString()
-  {
-    return JSParser20TreeConstants.jjtNodeName[id];
-  }
-
-  public String toString(String prefix)
-  {
-    return prefix + toString();
-  }
-
-  /* Override this method if you want to customize how the node dumps
-     out its children. */
-
-  public void dump(String prefix)
-  {
-    System.out.println(toString(prefix));
-
-    if (children != null)
-    {
-
-      for (int i = 0; i < children.length; ++i)
-      {
-        SimpleNode n = (SimpleNode) children[i];
-
-        if (n != null)
-        {
-          n.dump(prefix + " ");
-        }
-      }
-    }
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/Token.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/Token.java
deleted file mode 100644
index 39b3887..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/Token.java
+++ /dev/null
@@ -1,105 +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.
- */
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-/**
- * Describes the input token stream.
- */
-
-public class Token
-{
-  public boolean hasPrinted = false;
-  /**
-   * An integer that describes the kind of this token.  This numbering
-   * system is determined by JavaCCParser, and a table of these numbers is
-   * stored in the file ...Constants.java.
-   */
-  public int kind;
-
-  /**
-   * beginLine and beginColumn describe the position of the first character
-   * of this token; endLine and endColumn describe the position of the
-   * last character of this token.
-   */
-  public int beginLine, beginColumn, endLine, endColumn;
-
-  /**
-   * The string image of the token.
-   */
-  public String image;
-
-  /**
-   * A reference to the next regular (non-special) token from the input
-   * stream.  If this is the last token from the input stream, or if the
-   * token manager has not read tokens beyond this one, this field is
-   * set to null.  This is true only if this token is also a regular
-   * token.  Otherwise, see below for a description of the contents of
-   * this field.
-   */
-  public Token next;
-
-  /**
-   * This field is used to access special tokens that occur prior to this
-   * token, but after the immediately preceding regular (non-special) token.
-   * If there are no such special tokens, this field is set to null.
-   * When there are more than one such special token, this field refers
-   * to the last of these special tokens, which in turn refers to the next
-   * previous special token through its specialToken field, and so on
-   * until the first special token (whose specialToken field is null).
-   * The next fields of special tokens refer to other special tokens that
-   * immediately follow it (without an intervening regular token).  If there
-   * is no such token, this field is null.
-   */
-  public Token specialToken;
-
-  /**
-   * Returns the image.
-   */
-  public String toString()
-  {
-    return image;
-  }
-
-  /**
-   * Returns a new Token object, by default. However, if you want, you
-   * can create and return subclass objects based on the value of ofKind.
-   * Simply add the cases to the switch for all those special cases.
-   * For example, if you have a subclass of Token called IDToken that
-   * you want to create if ofKind is ID, simlpy add something like :
-   *
-   *    case MyParserConstants.ID : return new IDToken();
-   *
-   * to the following switch statement. Then you can cast matchedToken
-   * variable to the appropriate type and use it in your lexical actions.
-   */
-  public static final Token newToken(int ofKind)
-  {
-
-    switch (ofKind)
-    {
-
-    default:
-    {
-      return new Token();
-    }
-    }
-  }
-
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/TokenMgrError.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/TokenMgrError.java
deleted file mode 100644
index 4443294..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/TokenMgrError.java
+++ /dev/null
@@ -1,211 +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.
- */
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 3.0 */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-
-public class TokenMgrError extends Error
-{
-  /*
-   * Ordinals for various reasons why an Error of this type can be thrown.
-   */
-
-  /**
-   * Lexical error occured.
-   */
-  static final int LEXICAL_ERROR = 0;
-
-  /**
-   * An attempt wass made to create a second instance of a static token manager.
-   */
-  static final int STATIC_LEXER_ERROR = 1;
-
-  /**
-   * Tried to change to an invalid lexical state.
-   */
-  static final int INVALID_LEXICAL_STATE = 2;
-
-  /**
-   * Detected (and bailed out of) an infinite loop in the token manager.
-   */
-  static final int LOOP_DETECTED = 3;
-
-  /**
-   * Indicates the reason why the exception is thrown. It will have
-   * one of the above 4 values.
-   */
-  int errorCode;
-
-  /*
-   * Constructors of various flavors follow.
-   */
-
-  public TokenMgrError()
-  {
-  }
-
-  public TokenMgrError(String message, int reason)
-  {
-    super(message);
-    errorCode = reason;
-  }
-
-  public TokenMgrError(boolean EOFSeen, int lexState, int errorLine,
-                       int errorColumn, String errorAfter, char curChar,
-                       int reason)
-  {
-    this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter,
-                      curChar), reason);
-  }
-
-  /**
-   * Replaces unprintable characters by their espaced (or unicode escaped)
-   * equivalents in the given string
-   */
-  protected static final String addEscapes(String str)
-  {
-    StringBuffer retval = new StringBuffer();
-    char         ch;
-
-    for (int i = 0; i < str.length(); i++)
-    {
-
-      switch (str.charAt(i))
-      {
-
-      case 0:
-      {
-        continue;
-      }
-
-      case '\b':
-      {
-        retval.append("\\b");
-
-        continue;
-      }
-
-      case '\t':
-      {
-        retval.append("\\t");
-
-        continue;
-      }
-
-      case '\n':
-      {
-        retval.append("\\n");
-
-        continue;
-      }
-
-      case '\f':
-      {
-        retval.append("\\f");
-
-        continue;
-      }
-
-      case '\r':
-      {
-        retval.append("\\r");
-
-        continue;
-      }
-
-      case '\"':
-      {
-        retval.append("\\\"");
-
-        continue;
-      }
-
-      case '\'':
-      {
-        retval.append("\\\'");
-
-        continue;
-      }
-
-      case '\\':
-      {
-        retval.append("\\\\");
-
-        continue;
-      }
-
-      default:
-      {
-
-        if (((ch = str.charAt(i)) < 0x20) || (ch > 0x7e))
-        {
-          String s = "0000" + Integer.toString(ch, 16);
-          retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-        }
-        else
-        {
-          retval.append(ch);
-        }
-
-        continue;
-      }
-      }
-    }
-
-    return retval.toString();
-  }
-
-  /**
-   * Returns a detailed message for the Error when it is thrown by the
-   * token manager to indicate a lexical error.
-   * Parameters :
-   *    EOFSeen     : indicates if EOF caused the lexicl error
-   *    curLexState : lexical state in which this error occured
-   *    errorLine   : line number when the error occured
-   *    errorColumn : column number when the error occured
-   *    errorAfter  : prefix that was seen before this error occured
-   *    curchar     : the offending character
-   * Note: You can customize the lexical error message by modifying this method.
-   */
-  protected static String LexicalError(boolean EOFSeen, int lexState,
-                                       int errorLine, int errorColumn,
-                                       String errorAfter, char curChar)
-  {
-    return ("Lexical error at line " + errorLine + ", column " + errorColumn +
-        ".  Encountered: " +
-        (EOFSeen
-          ? "<EOF> "
-          : (("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" +
-            (int) curChar + "), ")) + "after : \"" + addEscapes(errorAfter) +
-        "\"");
-  }
-
-  /**
-   * You can also modify the body of this method to customize your error messages.
-   * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
-   * of end-users concern, so you can return something like :
-   *
-   *     "Internal Error : Please file a bug report .... "
-   *
-   * from this method for such cases in the release version of your parser.
-   */
-  public String getMessage()
-  {
-    return super.getMessage();
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/js2.0.jj b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/js2.0.jj
deleted file mode 100644
index 4ddd244..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/js2.0.jj
+++ /dev/null
@@ -1,4839 +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.
- */
-
-/*@bgen(jjtree) Generated By:JJTree: Do not edit this line. .\js2.0.jj */
-/*@egen*/options {
-    STATIC=false;                                                                
-    DEBUG_TOKEN_MANAGER=false;
-    DEBUG_PARSER=false;
-}
-
-PARSER_BEGIN(JSParser20)
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-import java.io.IOException;
-public class JSParser20/*@bgen(jjtree)*/implements JSParser20TreeConstants/*@egen*/ 
-{/*@bgen(jjtree)*/
-  protected JJTJSParser20State jjtree = new JJTJSParser20State();
-
-/*@egen*/
-    //
-    // This is the root node for the parse tree (root DOM node, tree of SimpleNode(s))
-    //
-    protected ASTProgram _jjtRoot;
-    
-    public ASTProgram getRootNode()
-    {
-    	return _jjtRoot;
-    }
-    
-}
-
-PARSER_END(JSParser20)
-
-
-
-/////////////////////////////////////////////////////
-// LEXICAL RULES Section
-/////////////////////////////////////////////////////
-TOKEN_MGR_DECLS :
-{
-    private boolean isRegValid = true;
-    public void setRegInvalid()
-    {
-        isRegValid = false;
-    }
-    public void setRegValid()
-    {
-        isRegValid = true;
-    }
-}
-
-/////////////////////////////////////////////////////
-// WHITE SPACE 
-/////////////////////////////////////////////////////
-SPECIAL_TOKEN :
-{
-        <EOL:   (["\n","\r"])+ >
-    |   <WS:    ([" ","\t"])+ >
-}
-/////////////////////////////////////////////////////
-// COMMENTS 
-/////////////////////////////////////////////////////
-MORE :
-{
-        "//" : IN_SINGLE_LINE_COMMENT
-    |   "/*" : IN_MULTI_LINE_COMMENT
-}
-
-<IN_SINGLE_LINE_COMMENT>
-SPECIAL_TOKEN :
-{
-        < SINGLE_LINE_COMMENT: (~["\n","\r"])* ("\n"|"\r"|"\r\n")? >  : DEFAULT
-}
-
-<IN_MULTI_LINE_COMMENT>
-SPECIAL_TOKEN :
-{
-        <MULTI_LINE_COMMENT: "*/" > : DEFAULT
-}
-
-<IN_SINGLE_LINE_COMMENT, IN_MULTI_LINE_COMMENT>
-MORE :
-{
-        < ~[] >
-}
-/////////////////////////////////////////////////////
-// RESERVED WORDS AND LITERALS
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < AS:           "as"         >
-    |   < BREAK:        "break"      >
-    |   < CASE:         "case"       >
-    |   < CATCH:        "catch"      >
-    |   < CLASS:        "class"      >
-    |   < CONST:        "const"      >
-    |   < CONTINUE:     "continue"   >
-    |   < _DEFAULT:     "default"    >
-    |   < DELETE:       "delete"     >
-    |   < DO:           "do"         >
-    |   < ELSE:         "else"       >
-    |   < EXTENDS:      "extends"    >
-    |   < FALSE:        "false"      >   
-    |   < FINALLY:      "finally"    >
-    |   < FOR:          "for"        >
-    |   < FUNCTION:     "function"   >
-    |   < FUNCTION_:    "Function"   >
-    |   < GET:          "get"        >
-    |   < IF:           "if"         >
-    |   < IN:           "in"         >
-    |   < INCLUDE:      "include"    >
-    |   < INSTANCEOF:   "instanceof" >
-    |   < IS:           "is"         >
-    |   < NAMESPACE:    "namespace"  >
-    |   < NEW:          "new"        >
-    |   < NULL:         "null"       >    
-    |   < PACKAGE:      "package"    > 
-    |   < PRIVATE:      "private"    >
-    |   < PUBLIC:       "public"     >
-    |   < RETURN:       "return"     >
-    |   < SET:          "set"        >
-    |   < SUPER:        "super"      >
-    |   < SWITCH:       "switch"     >
-    |   < THIS:         "this"       >
-    |   < THROW:        "throw"      >
-    |   < TRUE:         "true"       > 
-    |   < TRY:          "try"        >
-    |   < TYPEOF:       "typeof"     >
-    |   < USE:          "use"        >
-    |   < VAR:          "var"        >
-    |   < VOID:         "void"       >
-    |   < WHILE:        "while"      >
-    |   < WITH:         "with"       >
-}
-/////////////////////////////////////////////////////
-// FUTURE RESERVED WORDS
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < ABSTRACT:     "abstract"     >
-    |   < DEBUGGER:     "debugger"     >
-    |   < ENUM:         "enum"         >
-    |   < EXPORT:       "export"       >
-    |   < GOTO:         "goto"         >
-    |   < IMPLEMENTS:   "implements"   >
-    |   < INTERFACE:    "interface"    >
-    |   < NATIVE:       "native"       >
-    |   < PROTECTED:    "protected"    >
-    |   < SYNCHRONIZED: "synchronized" >
-    |   < THROWS:       "throws"       >
-    |   < TRANSIENT:    "transient"    >
-    |   < VOLATILE:     "volatile"     >
-    |   < IMPORT:       "import"       >
-}
-/////////////////////////////////////////////////////
-// LITERALS 
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* >
-    |   < HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ >
-    |   < OCTAL_LITERAL: "0" (["0"-"7"])* >
-    |   < FLOATING_POINT_LITERAL: (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? 
-                                |   "." (["0"-"9"])+ (<EXPONENT>)? 
-                                |   (["0"-"9"])+ (<EXPONENT>)? 
-        >
-    |   < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
-    |   < STRING_LITERAL:   "\""  
-                            ( (~["\"","\\","\n","\r"]) | <ESCAPE_SEQUENCE> )* 
-                            "\""
-                        |   "\"" 
-                            ( (~["\"","\\"]) | "\\" ("\n" | "\r" | "\r\n") | <ESCAPE_SEQUENCE> )* 
-                            "\""  
-                        |   "'"
-                            ( (~["'","\\","\n","\r"]) | <ESCAPE_SEQUENCE> )*
-                            "'"
-        >
-    |   < #ESCAPE_SEQUENCE: 
-            "\\"
-            (       ["n","t","b","r","f","\\","'","\"","[","]"]
-                |   ["0"-"7"] ( ["0"-"7"] )?
-                |   ["0"-"3"] ["0"-"7"] ["0"-"7"]
-                |   ["x"] ["0"-"9","a"-"f","A"-"F"] ["0"-"9","a"-"f","A"-"F"]
-                |   ["u"] ["0"-"9","a"-"f","A"-"F"] ["0"-"9","a"-"f","A"-"F"] 
-                          ["0"-"9","a"-"f","A"-"F"] ["0"-"9","a"-"f","A"-"F"]
-            )
-        >
-    |   < UNTERMINATED_STRING_LITERAL:
-                "\"" ( (~["\"","\\","\n","\r"]) | <ESCAPE_SEQUENCE> )* ( ["\n","\r"] )?
-            |   "'"  ( (~["'","\\","\n","\r"])  | <ESCAPE_SEQUENCE> )* ( ["\n","\r"] )?
-        >
-}
-/////////////////////////////////////////////////////
-// REGULAR EXPRESSIONS 
-/////////////////////////////////////////////////////
-TOKEN :
-{ 
-        < #REGX_START_CHAR : ~["\r","\n","/","=","*"] | "\\/">
-    |   < #REGX_BODY_CHAR_EXCLUSION : ~["\r","\n","/"] >  
-    |   < #REGX_BODY_CHAR : ( <REGX_BODY_CHAR_EXCLUSION> | "\\/" ) >
-    |   < #REGEX_END_CHAR :     "i" 
-                            |   "g" 
-                            |   "m" 
-                            |   "ig" 
-                            |   "im" 
-                            |   "gi" 
-                            |   "gm" 
-                            |   "mi" 
-                            |   "mg" 
-                            |   "igm" 
-                            |   "img" 
-                            |   "gmi" 
-                            |   "gim" 
-                            |   "mig" 
-                            |   "mgi" 
-                            
-        >
-}
-
-TOKEN :
-{
-        <REGULAR_EXPRESSION : "/" <REGX_START_CHAR> (<REGX_BODY_CHAR>)* "/"  (<REGEX_END_CHAR>)? >
-        {
-           try {
-                // Peek at the next character.
-                char nextCh = input_stream.readChar();
-                input_stream.backup(1);
-                if (isRegValid == false || nextCh == '/' || nextCh == '*') {
-                    //
-                    // Lexecal analyser thinks it is a RE
-                    // operator such as /...../
-                    // Put the everything to the first "/" back on the input stream
-                    //
-                    input_stream.backup(lengthOfMatch-1);
-                    //
-                    // And remove it from the token
-                    //
-                    matchedToken.image = matchedToken.image.substring(0, 1);
-                    image.delete(0, image.length() - 1);
-                    image.append('/');
-                    matchedToken.kind=SLASH;
-                }
-               } catch (IOException e) {
-                    throw new Error(e.toString());
-               }
-       }        
-        
-}
-/////////////////////////////////////////////////////
-// IDENTIFIERS 
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
-    |   < #LETTER: ["a"-"z","A"-"Z","$","_"] >
-    |   < #DIGIT: ["0"-"9"]>
-}
-/////////////////////////////////////////////////////
-// SEPARATORS 
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < LPAREN:    "("   >
-    |   < RPAREN:    ")"   >
-    |   < LBRACE:    "{"   >
-    |   < RBRACE:    "}"   >
-    |   < LBRACKET:  "["   >
-    |   < RBRACKET:  "]"   >
-    |   < SEMICOLON: ";"   >
-    |   < COMMA:     ","   >
-    |   < DOT:       "."   >
-    |   < QUALIFIER: "::"  >
-    |   < ELIPSE:    "..." >
-}
-
-/////////////////////////////////////////////////////
-// OPERATORS 
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < ASSIGN:               "="    >
-    |   < GT:                   ">"    >
-    |   < LT:                   "<"    >
-    |   < BANG:                 "!"    >
-    |   < TILDE:                "~"    >
-    |   < HOOK:                 "?"    >
-    |   < COLON:                ":"    >
-    |   < EQ:                   "=="   >
-    |   < LE:                   "<="   >
-    |   < GE:                   ">="   >
-    |   < NE:                   "!="   >
-    |   < SC_OR:                "||"   >
-    |   < SC_AND:               "&&"   >
-    |   < SC_XOR:               "^^"   >
-    |   < INCR:                 "++"   >
-    |   < DECR:                 "--"   >
-    |   < PLUS:                 "+"    >
-    |   < MINUS:                "-"    >
-    |   < STAR:                 "*"    >
-    |   < SLASH:                "/"    >
-    |   < BIT_AND:              "&"    >
-    |   < BIT_OR:               "|"    >
-    |   < XOR:                  "^"    >
-    |   < REM:                  "%"    >
-    |   < LSHIFT:               "<<"   >
-    |   < RSIGNEDSHIFT:         ">>"   >
-    |   < RUNSIGNEDSHIFT:       ">>>"  >
-    |   < PLUSASSIGN:           "+="   >
-    |   < MINUSASSIGN:          "-="   >
-    |   < STARASSIGN:           "*="   >
-    |   < SLASHASSIGN:          "/="   >
-    |   < ANDASSIGN:            "&="   >
-    |   < ORASSIGN:             "|="   >
-    |   < XORASSIGN:            "^="   >
-    |   < REMASSIGN:            "%="   >
-    |   < LSHIFTASSIGN:         "<<="  >
-    |   < RSIGNEDSHIFTASSIGN:   ">>="  >
-    |   < RUNSIGNEDSHIFTASSIGN: ">>>=" >
-    |   < SC_ORASSIGN:          "||="  >
-    |   < SC_ANDASSIGN:         "&&="  >
-    |   < SC_XORASSIGN:         "^^="  >
-    |   < IDENTITYOPER:         "==="  >
-    |   < NOTIDENTITYOPER:      "!=="  >
-}
-///////////////////////////////////////////////////////////////////
-// GRAMMAR Section
-///////////////////////////////////////////////////////////////////
-
-Token Program():
-{/*@bgen(jjtree) Program */
-        ASTProgram jjtn000 = new ASTProgram(this, JJTPROGRAM);
-        boolean jjtc000 = true;
-        jjtree.openNodeScope(jjtn000);
-/*@egen*/
-        Token retval = getToken(1);
-}
-{/*@bgen(jjtree) Program */
-        try {
-/*@egen*/
-        (PackageDefinition())* [Directives()] <EOF>/*@bgen(jjtree)*/
-        {
-          jjtree.closeNodeScope(jjtn000, true);
-          jjtc000 = false;
-        }
-/*@egen*/
-        {
-            _jjtRoot = jjtn000;
-            return retval;
-        }/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Expressions 
-/////////////////////////////////////////////////////
-
-/////////////////////////////////////////////////////
-// Identifier 
-/////////////////////////////////////////////////////
-void Identifier():
-{/*@bgen(jjtree) Identifier */
-  ASTIdentifier jjtn000 = new ASTIdentifier(this, JJTIDENTIFIER);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) Identifier */
-        try {
-/*@egen*/
-        <IDENTIFIER>
-    |   <GET>
-    |   <SET>
-    |   <INCLUDE>/*@bgen(jjtree)*/
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-//    |   <NAMESPACE>
-}
-
-/////////////////////////////////////////////////////
-// Qualified Identifier 
-/////////////////////////////////////////////////////
-void SimpleQualifiedIdentifier():
-{/*@bgen(jjtree) SimpleQualifiedIdentifier */
-  ASTSimpleQualifiedIdentifier jjtn000 = new ASTSimpleQualifiedIdentifier(this, JJTSIMPLEQUALIFIEDIDENTIFIER);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) SimpleQualifiedIdentifier */
-       try {
-/*@egen*/
-       Identifier() [<QUALIFIER> Identifier()]
-    |  ReservedNamespace() [<QUALIFIER> Identifier()]/*@bgen(jjtree)*/
-       } catch (Throwable jjte000) {
-         if (jjtc000) {
-           jjtree.clearNodeScope(jjtn000);
-           jjtc000 = false;
-         } else {
-           jjtree.popNode();
-         }
-         if (jjte000 instanceof RuntimeException) {
-           throw (RuntimeException)jjte000;
-         }
-         if (jjte000 instanceof ParseException) {
-           throw (ParseException)jjte000;
-         }
-         throw (Error)jjte000;
-       } finally {
-         if (jjtc000) {
-           jjtree.closeNodeScope(jjtn000, true);
-         }
-       }
-/*@egen*/ 
-}
-
-void ExpressionQualifiedIdentifier():
-{/*@bgen(jjtree) ExpressionQualifiedIdentifier */
-  ASTExpressionQualifiedIdentifier jjtn000 = new ASTExpressionQualifiedIdentifier(this, JJTEXPRESSIONQUALIFIEDIDENTIFIER);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ExpressionQualifiedIdentifier */
-       try {
-/*@egen*/
-       <LPAREN> AssignmentExpression() <RPAREN> <QUALIFIER> Identifier()/*@bgen(jjtree)*/
-       } catch (Throwable jjte000) {
-         if (jjtc000) {
-           jjtree.clearNodeScope(jjtn000);
-           jjtc000 = false;
-         } else {
-           jjtree.popNode();
-         }
-         if (jjte000 instanceof RuntimeException) {
-           throw (RuntimeException)jjte000;
-         }
-         if (jjte000 instanceof ParseException) {
-           throw (ParseException)jjte000;
-         }
-         throw (Error)jjte000;
-       } finally {
-         if (jjtc000) {
-           jjtree.closeNodeScope(jjtn000, true);
-         }
-       }
-/*@egen*/
-}
-
-void QualifiedIdentifier():
-{/*@bgen(jjtree) QualifiedIdentifier */
-  ASTQualifiedIdentifier jjtn000 = new ASTQualifiedIdentifier(this, JJTQUALIFIEDIDENTIFIER);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) QualifiedIdentifier */
-       try {
-/*@egen*/
-       SimpleQualifiedIdentifier()
-    |  ExpressionQualifiedIdentifier()/*@bgen(jjtree)*/
-       } catch (Throwable jjte000) {
-         if (jjtc000) {
-           jjtree.clearNodeScope(jjtn000);
-           jjtc000 = false;
-         } else {
-           jjtree.popNode();
-         }
-         if (jjte000 instanceof RuntimeException) {
-           throw (RuntimeException)jjte000;
-         }
-         if (jjte000 instanceof ParseException) {
-           throw (ParseException)jjte000;
-         }
-         throw (Error)jjte000;
-       } finally {
-         if (jjtc000) {
-           jjtree.closeNodeScope(jjtn000, true);
-         }
-       }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Primary Expressions
-/////////////////////////////////////////////////////
-void PrimaryExpression ():
-{/*@bgen(jjtree) PrimaryExpression */
-  ASTPrimaryExpression jjtn000 = new ASTPrimaryExpression(this, JJTPRIMARYEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) PrimaryExpression */
-    try {
-/*@egen*/
-    (
-        <NULL>
-    |   <TRUE>
-    |   <FALSE>
-    |   <DECIMAL_LITERAL> 
-    |   <OCTAL_LITERAL>
-    |   <HEX_LITERAL>
-    |   <FLOATING_POINT_LITERAL> 
-    |   <STRING_LITERAL> 
-    |   <THIS>
-    |   <REGULAR_EXPRESSION>
-    |   <LPAREN> ListExpression() <RPAREN>
-    |   ArrayLiteral()
-    |   ObjectLiteral()
-    |   FunctionExpression()
-    )/*@bgen(jjtree)*/
-    {
-      jjtree.closeNodeScope(jjtn000, true);
-      jjtc000 = false;
-    }
-/*@egen*/
-    {
-        token_source.setRegValid();
-    }/*@bgen(jjtree)*/
-    } catch (Throwable jjte000) {
-      if (jjtc000) {
-        jjtree.clearNodeScope(jjtn000);
-        jjtc000 = false;
-      } else {
-        jjtree.popNode();
-      }
-      if (jjte000 instanceof RuntimeException) {
-        throw (RuntimeException)jjte000;
-      }
-      if (jjte000 instanceof ParseException) {
-        throw (ParseException)jjte000;
-      }
-      throw (Error)jjte000;
-    } finally {
-      if (jjtc000) {
-        jjtree.closeNodeScope(jjtn000, true);
-      }
-    }
-/*@egen*/
-}
-
-void ReservedNamespace ():
-{/*@bgen(jjtree) ReservedNamespace */
-  ASTReservedNamespace jjtn000 = new ASTReservedNamespace(this, JJTRESERVEDNAMESPACE);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ReservedNamespace */
-       try {
-/*@egen*/
-       <PUBLIC>
-    |  <PROTECTED>
-    |  <PRIVATE>/*@bgen(jjtree)*/
-       } finally {
-         if (jjtc000) {
-           jjtree.closeNodeScope(jjtn000, true);
-         }
-       }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Function Expression
-/////////////////////////////////////////////////////
-void  FunctionExpression ():
-{/*@bgen(jjtree) FunctionExpression */
-  ASTFunctionExpression jjtn000 = new ASTFunctionExpression(this, JJTFUNCTIONEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) FunctionExpression */
-        try {
-/*@egen*/
-        LOOKAHEAD(2) <FUNCTION> FunctionCommon()
-    |                <FUNCTION> Identifier() FunctionCommon()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Object Literals
-/////////////////////////////////////////////////////
-void ObjectLiteral ():
-{/*@bgen(jjtree) ObjectLiteral */
-  ASTObjectLiteral jjtn000 = new ASTObjectLiteral(this, JJTOBJECTLITERAL);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ObjectLiteral */
-        try {
-/*@egen*/
-        <LBRACE> [FieldList()] <RBRACE>/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/  
-}        
-
-void FieldList():
-{/*@bgen(jjtree) FieldList */
-  ASTFieldList jjtn000 = new ASTFieldList(this, JJTFIELDLIST);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) FieldList */
-        try {
-/*@egen*/
-        LiteralField() (<COMMA> LiteralField())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void LiteralField ():
-{/*@bgen(jjtree) LiteralField */
-  ASTLiteralField jjtn000 = new ASTLiteralField(this, JJTLITERALFIELD);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) LiteralField */
-        try {
-/*@egen*/
-        FieldName() <COLON> AssignmentExpression()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void FieldName ():
-{/*@bgen(jjtree) FieldName */
-  ASTFieldName jjtn000 = new ASTFieldName(this, JJTFIELDNAME);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) FieldName */
-        try {
-/*@egen*/
-        <STRING_LITERAL>
-    |   <DECIMAL_LITERAL>
-    |   SimpleQualifiedIdentifier()
-    |   <LPAREN> AssignmentExpression() <RPAREN> [<QUALIFIER> Identifier()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}	
-
-/////////////////////////////////////////////////////
-// Array Literal
-/////////////////////////////////////////////////////
-void ArrayLiteral():
-{/*@bgen(jjtree) ArrayLiteral */
-  ASTArrayLiteral jjtn000 = new ASTArrayLiteral(this, JJTARRAYLITERAL);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ArrayLiteral */
-        try {
-/*@egen*/
-        <LBRACKET> [ElementList()] <RBRACKET>/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void ElementList():
-{/*@bgen(jjtree) ElementList */
-  ASTElementList jjtn000 = new ASTElementList(this, JJTELEMENTLIST);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ElementList */
-        try {
-/*@egen*/
-        LiteralElement() (<COMMA> LiteralElement())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void LiteralElement():
-{/*@bgen(jjtree) LiteralElement */
-  ASTLiteralElement jjtn000 = new ASTLiteralElement(this, JJTLITERALELEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) LiteralElement */
-        try {
-/*@egen*/
-        AssignmentExpression()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Super Expression
-/////////////////////////////////////////////////////
-void SuperExpression ():
-{/*@bgen(jjtree) SuperExpression */
-  ASTSuperExpression jjtn000 = new ASTSuperExpression(this, JJTSUPEREXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) SuperExpression */
-        try {
-/*@egen*/
-        <SUPER> [LOOKAHEAD(2) <LPAREN> AssignmentExpression() <RPAREN>]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Postfix Expression
-/////////////////////////////////////////////////////
-void PostfixExpression ():
-{/*@bgen(jjtree) PostfixExpression */
-  ASTPostfixExpression jjtn000 = new ASTPostfixExpression(this, JJTPOSTFIXEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) PostfixExpression */
-        try {
-/*@egen*/
-        AttributeExpression ()                            [PostfixOp()]
-    |   {token_source.setRegInvalid();} 
-        FullPostfixExpression () (PropertyOrArguments())* [PostfixOp()]
-    |   SuperExpression()         PropertyOperator()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}    
-
-void AttributeExpression ():
-{/*@bgen(jjtree) AttributeExpression */
-  ASTAttributeExpression jjtn000 = new ASTAttributeExpression(this, JJTATTRIBUTEEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) AttributeExpression */
-        try {
-/*@egen*/
-        SimpleQualifiedIdentifier()  (PropertyOrArguments())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void FullPostfixExpression ():
-{/*@bgen(jjtree) FullPostfixExpression */
-  ASTFullPostfixExpression jjtn000 = new ASTFullPostfixExpression(this, JJTFULLPOSTFIXEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) FullPostfixExpression */
-       try {
-/*@egen*/
-       LOOKAHEAD(<LPAREN> AssignmentExpression() <RPAREN> <QUALIFIER>) 
-       ExpressionQualifiedIdentifier()
-    |  PrimaryExpression() 
-    |  FullNewExpression()/*@bgen(jjtree)*/
-       } catch (Throwable jjte000) {
-         if (jjtc000) {
-           jjtree.clearNodeScope(jjtn000);
-           jjtc000 = false;
-         } else {
-           jjtree.popNode();
-         }
-         if (jjte000 instanceof RuntimeException) {
-           throw (RuntimeException)jjte000;
-         }
-         if (jjte000 instanceof ParseException) {
-           throw (ParseException)jjte000;
-         }
-         throw (Error)jjte000;
-       } finally {
-         if (jjtc000) {
-           jjtree.closeNodeScope(jjtn000, true);
-         }
-       }
-/*@egen*/             
-}
-
-void FullNewExpression ():
-{/*@bgen(jjtree) FullNewExpression */
-  ASTFullNewExpression jjtn000 = new ASTFullNewExpression(this, JJTFULLNEWEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) FullNewExpression */
-        try {
-/*@egen*/
-        <NEW> FullNewSubexpression()  (LOOKAHEAD(2) PropertyOperator())* [LOOKAHEAD(2) Arguments()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void FunctionConstructor():
-{/*@bgen(jjtree) FunctionConstructor */
-  ASTFunctionConstructor jjtn000 = new ASTFunctionConstructor(this, JJTFUNCTIONCONSTRUCTOR);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) FunctionConstructor */
-        try {
-/*@egen*/    
-        <FUNCTION_> Arguments()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void FullNewSubexpression ():
-{/*@bgen(jjtree) FullNewSubexpression */
-  ASTFullNewSubexpression jjtn000 = new ASTFullNewSubexpression(this, JJTFULLNEWSUBEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) FullNewSubexpression */
-        try {
-/*@egen*/
-        LOOKAHEAD(<LPAREN> AssignmentExpression() <RPAREN> <QUALIFIER>) 
-        ExpressionQualifiedIdentifier()        
-    |   PrimaryExpression() 
-    |   SimpleQualifiedIdentifier()
-    |   SuperExpression() 
-    |   FullNewExpression()
-    |   FunctionConstructor()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-
-void PostfixOp():
-{/*@bgen(jjtree) PostfixOp */
-  ASTPostfixOp jjtn000 = new ASTPostfixOp(this, JJTPOSTFIXOP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) PostfixOp */
-        try {
-/*@egen*/
-        <INCR>
-    |   <DECR>/*@bgen(jjtree)*/
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void PropertyOrArguments ():
-{/*@bgen(jjtree) PropertyOrArguments */
-  ASTPropertyOrArguments jjtn000 = new ASTPropertyOrArguments(this, JJTPROPERTYORARGUMENTS);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) PropertyOrArguments */
-        try {
-/*@egen*/
-        Arguments()        
-    |   PropertyOperator()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Property Operators
-/////////////////////////////////////////////////////
-void PropertyOperator ():
-{/*@bgen(jjtree) PropertyOperator */
-  ASTPropertyOperator jjtn000 = new ASTPropertyOperator(this, JJTPROPERTYOPERATOR);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) PropertyOperator */
-        try {
-/*@egen*/          
-        <DOT>      QualifiedIdentifier()
-    |   LOOKAHEAD(2) <LBRACKET> <RBRACKET>
-    |   LOOKAHEAD(2) <LBRACKET> <ELIPSE> AssignmentExpression() <RBRACKET>
-    |                <LBRACKET> ListExpression() [<ELIPSE> AssignmentExpression()] <RBRACKET>/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void Arguments ():
-{/*@bgen(jjtree) Arguments */
- ASTArguments jjtn000 = new ASTArguments(this, JJTARGUMENTS);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
-/*@egen*/{token_source.setRegValid();}}
-{/*@bgen(jjtree) Arguments */
-        try {
-/*@egen*/
-        LOOKAHEAD(2) <LPAREN> <RPAREN>
-    |   LOOKAHEAD(2) <LPAREN> <ELIPSE> AssignmentExpression() <RPAREN>
-    |                <LPAREN> ListExpression() [<ELIPSE> AssignmentExpression()] <RPAREN>/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Unary Operators 
-/////////////////////////////////////////////////////
-void UnaryExpression ():
-{/*@bgen(jjtree) UnaryExpression */
-  ASTUnaryExpression jjtn000 = new ASTUnaryExpression(this, JJTUNARYEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) UnaryExpression */
-                 try {
-/*@egen*/
-                 PostfixExpression()
-    |   <DELETE> PostfixExpression()
-    |   <VOID>   UnaryExpression()
-    |   <TYPEOF> UnaryExpression()
-    |   <INCR>   PostfixExpression()
-    |   <DECR>   PostfixExpression()
-    |   <PLUS>   UnaryExpression()
-    |   <MINUS>  UnaryExpression()
-    |   <TILDE>  UnaryExpression()
-    |   <BANG>   UnaryExpression()/*@bgen(jjtree)*/
-                 } catch (Throwable jjte000) {
-                   if (jjtc000) {
-                     jjtree.clearNodeScope(jjtn000);
-                     jjtc000 = false;
-                   } else {
-                     jjtree.popNode();
-                   }
-                   if (jjte000 instanceof RuntimeException) {
-                     throw (RuntimeException)jjte000;
-                   }
-                   if (jjte000 instanceof ParseException) {
-                     throw (ParseException)jjte000;
-                   }
-                   throw (Error)jjte000;
-                 } finally {
-                   if (jjtc000) {
-                     jjtree.closeNodeScope(jjtn000, true);
-                   }
-                 }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Multiplicative Operators 
-/////////////////////////////////////////////////////
-void MulOp():
-{/*@bgen(jjtree) MulOp */
-  ASTMulOp jjtn000 = new ASTMulOp(this, JJTMULOP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) MulOp */
-        try {
-/*@egen*/
-        <STAR>
-    |   <SLASH>
-    |   <REM>/*@bgen(jjtree)*/
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/ 
-}
-
-void MultiplicativeExpression():
-{/*@bgen(jjtree) MultiplicativeExpression */
-  ASTMultiplicativeExpression jjtn000 = new ASTMultiplicativeExpression(this, JJTMULTIPLICATIVEEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) MultiplicativeExpression */
-        try {
-/*@egen*/
-        UnaryExpression() (MulOp() UnaryExpression())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-
-}
-
-/////////////////////////////////////////////////////
-// Additive Operators 
-/////////////////////////////////////////////////////
-void AddOp():
-{/*@bgen(jjtree) AddOp */
-  ASTAddOp jjtn000 = new ASTAddOp(this, JJTADDOP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) AddOp */
-        try {
-/*@egen*/
-        <PLUS>
-    |   <MINUS>/*@bgen(jjtree)*/
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void AdditiveExpression():
-{/*@bgen(jjtree) AdditiveExpression */
-  ASTAdditiveExpression jjtn000 = new ASTAdditiveExpression(this, JJTADDITIVEEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) AdditiveExpression */
-        try {
-/*@egen*/
-        MultiplicativeExpression() (AddOp() MultiplicativeExpression())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-} 
-
-/////////////////////////////////////////////////////
-// Bitwise Shift Operators 
-/////////////////////////////////////////////////////
-void ShiftOp():
-{/*@bgen(jjtree) ShiftOp */
-  ASTShiftOp jjtn000 = new ASTShiftOp(this, JJTSHIFTOP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ShiftOp */
-        try {
-/*@egen*/
-        <LSHIFT>
-    |   <RSIGNEDSHIFT>
-    |   <RUNSIGNEDSHIFT>/*@bgen(jjtree)*/
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void ShiftExpression():
-{/*@bgen(jjtree) ShiftExpression */
-  ASTShiftExpression jjtn000 = new ASTShiftExpression(this, JJTSHIFTEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ShiftExpression */
-        try {
-/*@egen*/
-        AdditiveExpression() (ShiftOp() AdditiveExpression())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Relational Operators 
-/////////////////////////////////////////////////////
-void RelOp():
-{/*@bgen(jjtree) RelOp */
-  ASTRelOp jjtn000 = new ASTRelOp(this, JJTRELOP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) RelOp */
-        try {
-/*@egen*/
-        <LT>
-    |   <GT> 
-    |   <LE> 
-    |   <GE>
-    |   <IS>
-    |   <AS>/*@bgen(jjtree)*/
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void RelationalExpression():
-{/*@bgen(jjtree) RelationalExpression */
-  ASTRelationalExpression jjtn000 = new ASTRelationalExpression(this, JJTRELATIONALEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) RelationalExpression */
-        try {
-/*@egen*/
-        ShiftExpression() 
-            (LOOKAHEAD(3)(RelOp() | <IN> | <INSTANCEOF> ) ShiftExpression())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void RelationalExpressionNoIN():
-{/*@bgen(jjtree) RelationalExpressionNoIN */
-  ASTRelationalExpressionNoIN jjtn000 = new ASTRelationalExpressionNoIN(this, JJTRELATIONALEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) RelationalExpressionNoIN */
-        try {
-/*@egen*/
-        ShiftExpression() 
-            ((RelOp() | <INSTANCEOF>)  ShiftExpression())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Equality Operators 
-/////////////////////////////////////////////////////
-void EqualOp():
-{/*@bgen(jjtree) EqualOp */
-  ASTEqualOp jjtn000 = new ASTEqualOp(this, JJTEQUALOP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) EqualOp */
-        try {
-/*@egen*/
-        <EQ> 
-    |   <NE> 
-    |   <IDENTITYOPER> 
-    |   <NOTIDENTITYOPER>/*@bgen(jjtree)*/
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void EqualityExpression():
-{/*@bgen(jjtree) EqualityExpression */
-  ASTEqualityExpression jjtn000 = new ASTEqualityExpression(this, JJTEQUALITYEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) EqualityExpression */
-        try {
-/*@egen*/
-        RelationalExpression() (EqualOp() RelationalExpression())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void EqualityExpressionNoIN():
-{/*@bgen(jjtree) EqualityExpressionNoIN */
-  ASTEqualityExpressionNoIN jjtn000 = new ASTEqualityExpressionNoIN(this, JJTEQUALITYEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) EqualityExpressionNoIN */
-        try {
-/*@egen*/
-        RelationalExpressionNoIN() (EqualOp() RelationalExpressionNoIN())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Binary Bitwise Operators 
-/////////////////////////////////////////////////////
-void BitwiseANDOp():
-{/*@bgen(jjtree) BitwiseANDOp */
-  ASTBitwiseANDOp jjtn000 = new ASTBitwiseANDOp(this, JJTBITWISEANDOP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) BitwiseANDOp */
-        try {
-/*@egen*/
-        <BIT_AND>/*@bgen(jjtree)*/
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void BitwiseANDExpression():
-{/*@bgen(jjtree) BitwiseANDExpression */
-  ASTBitwiseANDExpression jjtn000 = new ASTBitwiseANDExpression(this, JJTBITWISEANDEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) BitwiseANDExpression */
-        try {
-/*@egen*/
-        EqualityExpression() (BitwiseANDOp() EqualityExpression())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void BitwiseANDExpressionNoIN():
-{/*@bgen(jjtree) BitwiseANDExpressionNoIN */
-  ASTBitwiseANDExpressionNoIN jjtn000 = new ASTBitwiseANDExpressionNoIN(this, JJTBITWISEANDEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) BitwiseANDExpressionNoIN */
-        try {
-/*@egen*/
-        EqualityExpressionNoIN() (BitwiseANDOp() EqualityExpressionNoIN())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-
-void BitwiseXOROp():
-{/*@bgen(jjtree) BitwiseXOROp */
-  ASTBitwiseXOROp jjtn000 = new ASTBitwiseXOROp(this, JJTBITWISEXOROP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) BitwiseXOROp */
-        try {
-/*@egen*/
-        <XOR>/*@bgen(jjtree)*/
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void BitwiseXORExpression():
-{/*@bgen(jjtree) BitwiseXORExpression */
-  ASTBitwiseXORExpression jjtn000 = new ASTBitwiseXORExpression(this, JJTBITWISEXOREXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) BitwiseXORExpression */
-        try {
-/*@egen*/
-        BitwiseANDExpression() (BitwiseXOROp() BitwiseANDExpression())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void BitwiseXORExpressionNoIN():
-{/*@bgen(jjtree) BitwiseXORExpressionNoIN */
-  ASTBitwiseXORExpressionNoIN jjtn000 = new ASTBitwiseXORExpressionNoIN(this, JJTBITWISEXOREXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) BitwiseXORExpressionNoIN */
-        try {
-/*@egen*/
-        BitwiseANDExpressionNoIN() (BitwiseXOROp() BitwiseANDExpressionNoIN())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void BitwiseOROp():
-{/*@bgen(jjtree) BitwiseOROp */
-  ASTBitwiseOROp jjtn000 = new ASTBitwiseOROp(this, JJTBITWISEOROP);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) BitwiseOROp */
-        try {
-/*@egen*/
-        <BIT_OR>/*@bgen(jjtree)*/
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void BitwiseORExpression():
-{/*@bgen(jjtree) BitwiseORExpression */
-  ASTBitwiseORExpression jjtn000 = new ASTBitwiseORExpression(this, JJTBITWISEOREXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) BitwiseORExpression */
-        try {
-/*@egen*/
-        BitwiseXORExpression() (BitwiseOROp() BitwiseXORExpression())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void BitwiseORExpressionNoIN():
-{/*@bgen(jjtree) BitwiseORExpressionNoIN */
-  ASTBitwiseORExpressionNoIN jjtn000 = new ASTBitwiseORExpressionNoIN(this, JJTBITWISEOREXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) BitwiseORExpressionNoIN */
-        try {
-/*@egen*/
-        BitwiseXORExpressionNoIN() (BitwiseOROp() BitwiseXORExpressionNoIN())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Binary Logical Operators 
-/////////////////////////////////////////////////////
-void LogicalANDExpression():
-{/*@bgen(jjtree) LogicalANDExpression */
-  ASTLogicalANDExpression jjtn000 = new ASTLogicalANDExpression(this, JJTLOGICALANDEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) LogicalANDExpression */
-        try {
-/*@egen*/
-        BitwiseORExpression() (<SC_AND> BitwiseORExpression())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void LogicalANDExpressionNoIN():
-{/*@bgen(jjtree) LogicalANDExpressionNoIN */
-  ASTLogicalANDExpressionNoIN jjtn000 = new ASTLogicalANDExpressionNoIN(this, JJTLOGICALANDEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) LogicalANDExpressionNoIN */
-        try {
-/*@egen*/
-        BitwiseORExpressionNoIN() (<SC_AND> BitwiseORExpressionNoIN())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void LogicalORExpression():
-{/*@bgen(jjtree) LogicalORExpression */
-  ASTLogicalORExpression jjtn000 = new ASTLogicalORExpression(this, JJTLOGICALOREXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) LogicalORExpression */
-        try {
-/*@egen*/
-        LogicalANDExpression() (<SC_OR> LogicalANDExpression())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void LogicalORExpressionNoIN():
-{/*@bgen(jjtree) LogicalORExpressionNoIN */
-  ASTLogicalORExpressionNoIN jjtn000 = new ASTLogicalORExpressionNoIN(this, JJTLOGICALOREXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) LogicalORExpressionNoIN */
-        try {
-/*@egen*/
-        LogicalANDExpressionNoIN() (<SC_OR> LogicalANDExpressionNoIN())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Conditional Operators 
-/////////////////////////////////////////////////////
-void ConditionalExpression():
-{/*@bgen(jjtree) ConditionalExpression */
-  ASTConditionalExpression jjtn000 = new ASTConditionalExpression(this, JJTCONDITIONALEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ConditionalExpression */
-        try {
-/*@egen*/
-        LogicalORExpression() [<HOOK>  AssignmentExpression() 
-                               <COLON> AssignmentExpression()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void ConditionalExpressionNoIN():
-{/*@bgen(jjtree) ConditionalExpressionNoIN */
-  ASTConditionalExpressionNoIN jjtn000 = new ASTConditionalExpressionNoIN(this, JJTCONDITIONALEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ConditionalExpressionNoIN */
-        try {
-/*@egen*/
-        LogicalORExpressionNoIN()  [<HOOK>  AssignmentExpressionNoIN() 
-                                    <COLON> AssignmentExpressionNoIN()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void NonAssignmentExpression():
-{/*@bgen(jjtree) NonAssignmentExpression */
-  ASTNonAssignmentExpression jjtn000 = new ASTNonAssignmentExpression(this, JJTNONASSIGNMENTEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) NonAssignmentExpression */
-        try {
-/*@egen*/
-        LogicalORExpression() [<HOOK>  NonAssignmentExpression() 
-                               <COLON> NonAssignmentExpression()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void NonAssignmentExpressionNoIN():
-{/*@bgen(jjtree) NonAssignmentExpressionNoIN */
-  ASTNonAssignmentExpressionNoIN jjtn000 = new ASTNonAssignmentExpressionNoIN(this, JJTNONASSIGNMENTEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) NonAssignmentExpressionNoIN */
-        try {
-/*@egen*/
-        LogicalORExpressionNoIN() [<HOOK>  NonAssignmentExpressionNoIN() 
-                                   <COLON> NonAssignmentExpressionNoIN()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Assignment Operators 
-/////////////////////////////////////////////////////
-void AssignementOperator():
-{/*@bgen(jjtree) AssignementOperator */
-  ASTAssignementOperator jjtn000 = new ASTAssignementOperator(this, JJTASSIGNEMENTOPERATOR);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) AssignementOperator */
-        try {
-/*@egen*/
-        <ASSIGN>
-    |   <STARASSIGN>
-    |   <SLASHASSIGN> 
-    |   <REMASSIGN> 
-    |   <PLUSASSIGN>
-    |   <MINUSASSIGN> 
-    |   <LSHIFTASSIGN> 
-    |   <RSIGNEDSHIFTASSIGN>
-    |   <RUNSIGNEDSHIFTASSIGN>
-    |   <ANDASSIGN> 
-    |   <XORASSIGN> 
-    |   <ORASSIGN>
-    |   <SC_ANDASSIGN>
-    |   <SC_XORASSIGN>
-    |   <SC_ORASSIGN>/*@bgen(jjtree)*/
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
- 
-}
-
-void AssignmentExpression():
-{/*@bgen(jjtree) AssignmentExpression */
-  ASTAssignmentExpression jjtn000 = new ASTAssignmentExpression(this, JJTASSIGNMENTEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) AssignmentExpression */
-        try {
-/*@egen*/
-        ConditionalExpression() [LOOKAHEAD(2) AssignementOperator() AssignmentExpression()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void AssignmentExpressionNoIN():
-{/*@bgen(jjtree) AssignmentExpressionNoIN */
-  ASTAssignmentExpressionNoIN jjtn000 = new ASTAssignmentExpressionNoIN(this, JJTASSIGNMENTEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) AssignmentExpressionNoIN */
-        try {
-/*@egen*/
-        ConditionalExpressionNoIN() [LOOKAHEAD(2) AssignementOperator() AssignmentExpressionNoIN()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Comma Expressions
-/////////////////////////////////////////////////////
-void ListExpression ():
-{/*@bgen(jjtree) ListExpression */
-  ASTListExpression jjtn000 = new ASTListExpression(this, JJTLISTEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ListExpression */
-        try {
-/*@egen*/
-        AssignmentExpression() (<COMMA> AssignmentExpression())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}   
-
-void ListExpressionNoIN ():
-{/*@bgen(jjtree) ListExpressionNoIN */
-  ASTListExpressionNoIN jjtn000 = new ASTListExpressionNoIN(this, JJTLISTEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ListExpressionNoIN */
-        try {
-/*@egen*/
-        AssignmentExpressionNoIN() (<COMMA> AssignmentExpressionNoIN())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}   
-
-/////////////////////////////////////////////////////
-// Type Expressions
-/////////////////////////////////////////////////////
-void TypeExpression ():
-{/*@bgen(jjtree) TypeExpression */
-  ASTTypeExpression jjtn000 = new ASTTypeExpression(this, JJTTYPEEXPRESSION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) TypeExpression */
-        try {
-/*@egen*/
-        NonAssignmentExpression()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void TypeExpressionNoIN ():
-{/*@bgen(jjtree) TypeExpressionNoIN */
-  ASTTypeExpressionNoIN jjtn000 = new ASTTypeExpressionNoIN(this, JJTTYPEEXPRESSIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) TypeExpressionNoIN */
-        try {
-/*@egen*/
-        NonAssignmentExpressionNoIN()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void TypeExpressionList ():
-{/*@bgen(jjtree) TypeExpressionList */
-  ASTTypeExpressionList jjtn000 = new ASTTypeExpressionList(this, JJTTYPEEXPRESSIONLIST);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) TypeExpressionList */
-        try {
-/*@egen*/
-        NonAssignmentExpression() (<COMMA> NonAssignmentExpression())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-/////////////////////////////////////////////////////
-// Staements (abbrev, noShortIf, full) 
-/////////////////////////////////////////////////////
-void Statement ():
-{/*@bgen(jjtree) Statement */
-  ASTStatement jjtn000 = new ASTStatement(this, JJTSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) Statement */
-        try {
-/*@egen*/
-        LOOKAHEAD(3) ExpressionStatement() Sc()
-    |                SuperStatement() Sc()
-    |                Block()
-    |                LabeledStatement()
-    |                IfStatement()
-    |                SwitchStatement()
-    |                DoStatement() Sc()
-    |                WhileStatement()
-    |                ForStatement()
-    |                WithStatement()
-    |                ContinueStatement() Sc()
-    |                BreakStatement() Sc()
-    |                ReturnStatement() Sc()
-    |                ThrowStatement() Sc()
-    |                TryStatement()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void Substatement ():
-{/*@bgen(jjtree) Substatement */
-  ASTSubstatement jjtn000 = new ASTSubstatement(this, JJTSUBSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) Substatement */
-                     try {
-/*@egen*/
-                     EmptyStatement()
-    |   LOOKAHEAD(2) Statement()
-    |                SimpleVariableDefinition() Sc()
-    |                Attributes()               <LBRACE> Substatements() <RBRACE>/*@bgen(jjtree)*/
-                     } catch (Throwable jjte000) {
-                       if (jjtc000) {
-                         jjtree.clearNodeScope(jjtn000);
-                         jjtc000 = false;
-                       } else {
-                         jjtree.popNode();
-                       }
-                       if (jjte000 instanceof RuntimeException) {
-                         throw (RuntimeException)jjte000;
-                       }
-                       if (jjte000 instanceof ParseException) {
-                         throw (ParseException)jjte000;
-                       }
-                       throw (Error)jjte000;
-                     } finally {
-                       if (jjtc000) {
-                         jjtree.closeNodeScope(jjtn000, true);
-                       }
-                     }
-/*@egen*/
-}
-
-void Substatements ():
-{/*@bgen(jjtree) Substatements */
-  ASTSubstatements jjtn000 = new ASTSubstatements(this, JJTSUBSTATEMENTS);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) Substatements */
-        try {
-/*@egen*/
-        (Substatement())+/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-JAVACODE
-  void Sc() {/*@bgen(jjtree) Sc */
- ASTSc jjtn000 = new ASTSc(this, JJTSC);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- try {
-/*@egen*/
-    Token tok = getToken(1);
-    if (tok.kind == SEMICOLON) {
-       tok = getNextToken();
-    } else if (tok.specialToken != null) {
-       if (!EolCommentSkipWs(tok.specialToken) && (tok.kind != EOF)) {
-          throw generateParseException();
-       }
-    } else if ((tok.kind != EOF) && (tok.kind!=RBRACE)) {
-         throw generateParseException();
-    }/*@bgen(jjtree)*/
- } finally {
-   if (jjtc000) {
-     jjtree.closeNodeScope(jjtn000, true);
-   }
- }
-/*@egen*/
-  }
- 
-JAVACODE
-  boolean EolCommentSkipWs(Token t) {/*@bgen(jjtree) EolCommentSkipWs */
- ASTEolCommentSkipWs jjtn000 = new ASTEolCommentSkipWs(this, JJTEOLCOMMENTSKIPWS);
- boolean jjtc000 = true;
- jjtree.openNodeScope(jjtn000);
- try {
-/*@egen*/
-    boolean retVal = false;
-    Token specialToken = t;
-    while(specialToken != null) {
-      if(specialToken.kind == WS) {
-        specialToken = specialToken.specialToken;
-        continue;
-      }
-      else if(specialToken.kind == EOL  ||
-              specialToken.kind == SINGLE_LINE_COMMENT) {
-        retVal = true;
-        break;
-      }
-      else {
-        break;
-      }
-    }
-    return retVal;/*@bgen(jjtree)*/
- } finally {
-   if (jjtc000) {
-     jjtree.closeNodeScope(jjtn000, true);
-   }
- }
-/*@egen*/
-  }
- 
-/////////////////////////////////////////////////////
-// Empty Statement 
-/////////////////////////////////////////////////////
-void EmptyStatement():
-{/*@bgen(jjtree) EmptyStatement */
-  ASTEmptyStatement jjtn000 = new ASTEmptyStatement(this, JJTEMPTYSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) EmptyStatement */
-        try {
-/*@egen*/
-        <SEMICOLON>/*@bgen(jjtree)*/
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Expresion Statement 
-/////////////////////////////////////////////////////
-void ExpressionStatement():
-{/*@bgen(jjtree) ExpressionStatement */
-  ASTExpressionStatement jjtn000 = new ASTExpressionStatement(this, JJTEXPRESSIONSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ExpressionStatement */
-        try {
-/*@egen*/
-        ListExpression()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/ 
-}
-
-/////////////////////////////////////////////////////
-// Super Statement 
-/////////////////////////////////////////////////////
-void SuperStatement ():
-{/*@bgen(jjtree) SuperStatement */
-  ASTSuperStatement jjtn000 = new ASTSuperStatement(this, JJTSUPERSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) SuperStatement */
-        try {
-/*@egen*/
-        <SUPER> Arguments()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Block Statement 
-/////////////////////////////////////////////////////
-void Block ():
-{/*@bgen(jjtree) Block */
-  ASTBlock jjtn000 = new ASTBlock(this, JJTBLOCK);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) Block */
-        try {
-/*@egen*/   
-        <LBRACE> [Directives()] <RBRACE>/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Labeled Statement (maps to literal field)
-/////////////////////////////////////////////////////
-void LabeledStatement ():
-{/*@bgen(jjtree) LabeledStatement */
-  ASTLabeledStatement jjtn000 = new ASTLabeledStatement(this, JJTLABELEDSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) LabeledStatement */
-        try {
-/*@egen*/
-        Identifier() <COLON> Substatement()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// If Statement 
-/////////////////////////////////////////////////////
-void IfStatement():
-{/*@bgen(jjtree) IfStatement */
-  ASTIfStatement jjtn000 = new ASTIfStatement(this, JJTIFSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) IfStatement */
-        try {
-/*@egen*/
-        <IF> <LPAREN> ListExpression() <RPAREN> 
-            Substatement() 
-            [LOOKAHEAD(1) <ELSE> Substatement()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Switch Statement 
-/////////////////////////////////////////////////////
-void SwitchStatement ():
-{/*@bgen(jjtree) SwitchStatement */
-  ASTSwitchStatement jjtn000 = new ASTSwitchStatement(this, JJTSWITCHSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) SwitchStatement */
-        try {
-/*@egen*/
-        <SWITCH> <LPAREN> ListExpression() <RPAREN>
-                 <LBRACE> [CaseElements()] <RBRACE>/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void CaseElements ():
-{/*@bgen(jjtree) CaseElements */
-  ASTCaseElements jjtn000 = new ASTCaseElements(this, JJTCASEELEMENTS);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) CaseElements */
-        try {
-/*@egen*/
-        CaseLabel() (CaseElement())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void CaseElement ():
-{/*@bgen(jjtree) CaseElement */
-  ASTCaseElement jjtn000 = new ASTCaseElement(this, JJTCASEELEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) CaseElement */
-        try {
-/*@egen*/
-        Directive()
-    |   CaseLabel()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void CaseLabel ():
-{/*@bgen(jjtree) CaseLabel */
-  ASTCaseLabel jjtn000 = new ASTCaseLabel(this, JJTCASELABEL);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) CaseLabel */
-        try {
-/*@egen*/
-        <CASE> ListExpression() <COLON>
-    |   <_DEFAULT> <COLON>/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Do-While Statement 
-/////////////////////////////////////////////////////
-void DoStatement(): 
-{/*@bgen(jjtree) DoStatement */
-  ASTDoStatement jjtn000 = new ASTDoStatement(this, JJTDOSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) DoStatement */
-        try {
-/*@egen*/
-        <DO> Substatement() <WHILE> <LPAREN> ListExpression() <RPAREN>/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// While Statement
-/////////////////////////////////////////////////////
-void WhileStatement ():
-{/*@bgen(jjtree) WhileStatement */
-  ASTWhileStatement jjtn000 = new ASTWhileStatement(this, JJTWHILESTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) WhileStatement */
-        try {
-/*@egen*/
-        <WHILE> <LPAREN> ListExpression() <RPAREN>
-           Substatement()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// For Statements 
-/////////////////////////////////////////////////////
-void ForStatement ():
-{/*@bgen(jjtree) ForStatement */
-  ASTForStatement jjtn000 = new ASTForStatement(this, JJTFORSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ForStatement */
-         try {
-/*@egen*/
-         LOOKAHEAD(<FOR> <LPAREN> ForInBinding() <IN>)
-                   <FOR> <LPAREN> ForInBinding() <IN> ListExpression() <RPAREN>
-                      Substatement()
-    |              <FOR> <LPAREN> [ForInitializer()] <SEMICOLON> 
-                       [ListExpression()] <SEMICOLON> 
-                       [ListExpression()] <RPAREN> 
-                      Substatement()/*@bgen(jjtree)*/
-         } catch (Throwable jjte000) {
-           if (jjtc000) {
-             jjtree.clearNodeScope(jjtn000);
-             jjtc000 = false;
-           } else {
-             jjtree.popNode();
-           }
-           if (jjte000 instanceof RuntimeException) {
-             throw (RuntimeException)jjte000;
-           }
-           if (jjte000 instanceof ParseException) {
-             throw (ParseException)jjte000;
-           }
-           throw (Error)jjte000;
-         } finally {
-           if (jjtc000) {
-             jjtree.closeNodeScope(jjtn000, true);
-           }
-         }
-/*@egen*/
-}
-
-void ForInitializer ():
-{/*@bgen(jjtree) ForInitializer */
-  ASTForInitializer jjtn000 = new ASTForInitializer(this, JJTFORINITIALIZER);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ForInitializer */
-        try {
-/*@egen*/
-        LOOKAHEAD(3) ListExpressionNoIN()
-    |                VariableDefinitionNoIN()
-    |                Attributes()             VariableDefinitionNoIN()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void ForInBinding ():
-{/*@bgen(jjtree) ForInBinding */
-  ASTForInBinding jjtn000 = new ASTForInBinding(this, JJTFORINBINDING);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ForInBinding */
-        try {
-/*@egen*/
-        LOOKAHEAD(3) PostfixExpression()
-    |                VariableDefinitionKind() VariableBindingNoIN()
-    |                Attributes()             VariableDefinitionKind() VariableBindingNoIN()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// With Statement 
-/////////////////////////////////////////////////////
-void WithStatement():
-{/*@bgen(jjtree) WithStatement */
-  ASTWithStatement jjtn000 = new ASTWithStatement(this, JJTWITHSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) WithStatement */
-        try {
-/*@egen*/
-        <WITH> <LPAREN> ExpressionStatement() <RPAREN>
-            Substatement()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Continue and Break Statement
-/////////////////////////////////////////////////////
-void ContinueStatement():
-{/*@bgen(jjtree) ContinueStatement */
-  ASTContinueStatement jjtn000 = new ASTContinueStatement(this, JJTCONTINUESTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ContinueStatement */
-        try {
-/*@egen*/
-        <CONTINUE> [Identifier()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void BreakStatement():
-{/*@bgen(jjtree) BreakStatement */
-  ASTBreakStatement jjtn000 = new ASTBreakStatement(this, JJTBREAKSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) BreakStatement */
-        try {
-/*@egen*/
-        <BREAK> [Identifier()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
- 
-
-/////////////////////////////////////////////////////
-// Return Statement
-/////////////////////////////////////////////////////
-void ReturnStatement():
-{/*@bgen(jjtree) ReturnStatement */
-  ASTReturnStatement jjtn000 = new ASTReturnStatement(this, JJTRETURNSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ReturnStatement */
-        try {
-/*@egen*/
-        <RETURN> [ListExpression()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Throw Statement
-/////////////////////////////////////////////////////
-void ThrowStatement():
-{/*@bgen(jjtree) ThrowStatement */
-  ASTThrowStatement jjtn000 = new ASTThrowStatement(this, JJTTHROWSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ThrowStatement */
-        try {
-/*@egen*/
-        <THROW> ListExpression()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Try Statement
-/////////////////////////////////////////////////////
-void TryStatement():
-{/*@bgen(jjtree) TryStatement */
-  ASTTryStatement jjtn000 = new ASTTryStatement(this, JJTTRYSTATEMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) TryStatement */
-        try {
-/*@egen*/
-        <TRY> Block()
-        (<CATCH> <LPAREN> Identifier() <RPAREN> Block())*
-        [<FINALLY> Block()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-} 
- 
-/////////////////////////////////////////////////////
-// Directives 
-/////////////////////////////////////////////////////
-void Directives ():
-{/*@bgen(jjtree) Directives */
-  ASTDirectives jjtn000 = new ASTDirectives(this, JJTDIRECTIVES);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) Directives */
-        try {
-/*@egen*/
-        (Directive())+/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void Directive ():
-{/*@bgen(jjtree) Directive */
-  ASTDirective jjtn000 = new ASTDirective(this, JJTDIRECTIVE);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) Directive */
-                      try {
-/*@egen*/
-                      EmptyStatement()
-     |   LOOKAHEAD(3) Statement()
-     |   LOOKAHEAD(2) AnnotatableDirective()
-     |   LOOKAHEAD(2) Attributes()            <LBRACE> Directives() <RBRACE>
-     |   LOOKAHEAD(2) Attributes()            AnnotatableDirective() 
-     |                IncludeDirective()      Sc()
-     |                Pragma()                Sc()/*@bgen(jjtree)*/
-                      } catch (Throwable jjte000) {
-                        if (jjtc000) {
-                          jjtree.clearNodeScope(jjtn000);
-                          jjtc000 = false;
-                        } else {
-                          jjtree.popNode();
-                        }
-                        if (jjte000 instanceof RuntimeException) {
-                          throw (RuntimeException)jjte000;
-                        }
-                        if (jjte000 instanceof ParseException) {
-                          throw (ParseException)jjte000;
-                        }
-                        throw (Error)jjte000;
-                      } finally {
-                        if (jjtc000) {
-                          jjtree.closeNodeScope(jjtn000, true);
-                        }
-                      }
-/*@egen*/
-}
-
-void AnnotatableDirective ():
-{/*@bgen(jjtree) AnnotatableDirective */
-  ASTAnnotatableDirective jjtn000 = new ASTAnnotatableDirective(this, JJTANNOTATABLEDIRECTIVE);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) AnnotatableDirective */
-         try {
-/*@egen*/
-         VariableDefinition() Sc()
-     |   FunctionDefinition()
-     |   ClassDefinition()
-     |   InterfaceDefinition()
-     |   NamespaceDefinition() Sc()
-     |   ImportDirective() Sc()
-     |   ExportDefinition() Sc()
-     |   UseDirective() Sc()/*@bgen(jjtree)*/
-         } catch (Throwable jjte000) {
-           if (jjtc000) {
-             jjtree.clearNodeScope(jjtn000);
-             jjtc000 = false;
-           } else {
-             jjtree.popNode();
-           }
-           if (jjte000 instanceof RuntimeException) {
-             throw (RuntimeException)jjte000;
-           }
-           if (jjte000 instanceof ParseException) {
-             throw (ParseException)jjte000;
-           }
-           throw (Error)jjte000;
-         } finally {
-           if (jjtc000) {
-             jjtree.closeNodeScope(jjtn000, true);
-           }
-         }
-/*@egen*/
-}
-/////////////////////////////////////////////////////
-// Attributes
-/////////////////////////////////////////////////////
-void Attributes ():
-{/*@bgen(jjtree) Attributes */
-  ASTAttributes jjtn000 = new ASTAttributes(this, JJTATTRIBUTES);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) Attributes */
-        try {
-/*@egen*/
-        (Attribute ())+/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void Attribute ():
-{/*@bgen(jjtree) Attribute */
-  ASTAttribute jjtn000 = new ASTAttribute(this, JJTATTRIBUTE);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) Attribute */
-                     try {
-/*@egen*/
-                     AttributeExpression()
-    |                <TRUE>
-    |                <FALSE>/*@bgen(jjtree)*/
-                     } catch (Throwable jjte000) {
-                       if (jjtc000) {
-                         jjtree.clearNodeScope(jjtn000);
-                         jjtc000 = false;
-                       } else {
-                         jjtree.popNode();
-                       }
-                       if (jjte000 instanceof RuntimeException) {
-                         throw (RuntimeException)jjte000;
-                       }
-                       if (jjte000 instanceof ParseException) {
-                         throw (ParseException)jjte000;
-                       }
-                       throw (Error)jjte000;
-                     } finally {
-                       if (jjtc000) {
-                         jjtree.closeNodeScope(jjtn000, true);
-                       }
-                     }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Use Directive
-/////////////////////////////////////////////////////
-void UseDirective ():
-{/*@bgen(jjtree) UseDirective */
-  ASTUseDirective jjtn000 = new ASTUseDirective(this, JJTUSEDIRECTIVE);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) UseDirective */
-        try {
-/*@egen*/ 
-        <USE> <NAMESPACE> <LPAREN> ListExpression() <RPAREN>/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Import Directive
-/////////////////////////////////////////////////////
-void ImportDirective ():
-{/*@bgen(jjtree) ImportDirective */
-  ASTImportDirective jjtn000 = new ASTImportDirective(this, JJTIMPORTDIRECTIVE);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ImportDirective */
-        try {
-/*@egen*/
-        LOOKAHEAD(3) <IMPORT> PackageName()
-    |                <IMPORT> Identifier() <ASSIGN> PackageName()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Include Directive
-/////////////////////////////////////////////////////
-void IncludeDirective (): 
-{/*@bgen(jjtree) IncludeDirective */
-  ASTIncludeDirective jjtn000 = new ASTIncludeDirective(this, JJTINCLUDEDIRECTIVE);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) IncludeDirective */
-        try {
-/*@egen*/
-        <INCLUDE> <STRING_LITERAL>/*@bgen(jjtree)*/
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Pragma
-/////////////////////////////////////////////////////
-void Pragma ():
-{/*@bgen(jjtree) Pragma */
-  ASTPragma jjtn000 = new ASTPragma(this, JJTPRAGMA);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) Pragma */
-        try {
-/*@egen*/
-        <USE> PragmaItems()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void PragmaItems ():
-{/*@bgen(jjtree) PragmaItems */
-  ASTPragmaItems jjtn000 = new ASTPragmaItems(this, JJTPRAGMAITEMS);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) PragmaItems */
-        try {
-/*@egen*/
-        PragmaItem() (<COMMA> PragmaItem())/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void PragmaItem ():
-{/*@bgen(jjtree) PragmaItem */
-  ASTPragmaItem jjtn000 = new ASTPragmaItem(this, JJTPRAGMAITEM);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) PragmaItem */
-        try {
-/*@egen*/
-        PragmaExpr() [<HOOK>]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-
-void PragmaExpr ():
-{/*@bgen(jjtree) PragmaExpr */
-  ASTPragmaExpr jjtn000 = new ASTPragmaExpr(this, JJTPRAGMAEXPR);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) PragmaExpr */
-        try {
-/*@egen*/
-        Identifier() [<LPAREN> PragmaArgument() <RPAREN>]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void PragmaArgument ():
-{/*@bgen(jjtree) PragmaArgument */
-  ASTPragmaArgument jjtn000 = new ASTPragmaArgument(this, JJTPRAGMAARGUMENT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) PragmaArgument */
-        try {
-/*@egen*/
-        <TRUE>
-    |   <FALSE>
-    |   <DECIMAL_LITERAL> 
-    |   <OCTAL_LITERAL>
-    |   <HEX_LITERAL>
-    |   <FLOATING_POINT_LITERAL> 
-    |   <STRING_LITERAL>/*@bgen(jjtree)*/
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/ 
-}
-
-/////////////////////////////////////////////////////
-// Definitions 
-/////////////////////////////////////////////////////
-
-/////////////////////////////////////////////////////
-// Export Definition 
-/////////////////////////////////////////////////////
-void ExportDefinition ():
-{/*@bgen(jjtree) ExportDefinition */
-  ASTExportDefinition jjtn000 = new ASTExportDefinition(this, JJTEXPORTDEFINITION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ExportDefinition */
-        try {
-/*@egen*/
-        <EXPORT> ExportBindingList ()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void ExportBindingList ():
-{/*@bgen(jjtree) ExportBindingList */
-  ASTExportBindingList jjtn000 = new ASTExportBindingList(this, JJTEXPORTBINDINGLIST);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ExportBindingList */
-        try {
-/*@egen*/
-        ExportBinding() (<COMMA> ExportBinding())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void ExportBinding ():
-{/*@bgen(jjtree) ExportBinding */
-  ASTExportBinding jjtn000 = new ASTExportBinding(this, JJTEXPORTBINDING);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ExportBinding */
-        try {
-/*@egen*/
-        LOOKAHEAD(2) FunctionName ()
-    |                FunctionName () <ASSIGN> FunctionName ()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Variable Definition (in, NoIN)
-/////////////////////////////////////////////////////
-void VariableDefinition ():
-{/*@bgen(jjtree) VariableDefinition */
-  ASTVariableDefinition jjtn000 = new ASTVariableDefinition(this, JJTVARIABLEDEFINITION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) VariableDefinition */
-        try {
-/*@egen*/
-        VariableDefinitionKind() VariableBindingList()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void VariableDefinitionNoIN ():
-{/*@bgen(jjtree) VariableDefinitionNoIN */
-  ASTVariableDefinitionNoIN jjtn000 = new ASTVariableDefinitionNoIN(this, JJTVARIABLEDEFINITIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) VariableDefinitionNoIN */
-        try {
-/*@egen*/
-        VariableDefinitionKind() VariableBindingListNoIN()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-
-void VariableDefinitionKind ():
-{/*@bgen(jjtree) VariableDefinitionKind */
-  ASTVariableDefinitionKind jjtn000 = new ASTVariableDefinitionKind(this, JJTVARIABLEDEFINITIONKIND);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) VariableDefinitionKind */
-        try {
-/*@egen*/
-        <VAR>
-    |   <CONST>/*@bgen(jjtree)*/
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void VariableBindingList ():
-{/*@bgen(jjtree) VariableBindingList */
-  ASTVariableBindingList jjtn000 = new ASTVariableBindingList(this, JJTVARIABLEBINDINGLIST);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) VariableBindingList */
-   try {
-/*@egen*/
-   VariableBinding() (<COMMA> VariableBinding ())*/*@bgen(jjtree)*/
-   } catch (Throwable jjte000) {
-     if (jjtc000) {
-       jjtree.clearNodeScope(jjtn000);
-       jjtc000 = false;
-     } else {
-       jjtree.popNode();
-     }
-     if (jjte000 instanceof RuntimeException) {
-       throw (RuntimeException)jjte000;
-     }
-     if (jjte000 instanceof ParseException) {
-       throw (ParseException)jjte000;
-     }
-     throw (Error)jjte000;
-   } finally {
-     if (jjtc000) {
-       jjtree.closeNodeScope(jjtn000, true);
-     }
-   }
-/*@egen*/
-}
-
-void VariableBindingListNoIN ():
-{/*@bgen(jjtree) VariableBindingListNoIN */
-  ASTVariableBindingListNoIN jjtn000 = new ASTVariableBindingListNoIN(this, JJTVARIABLEBINDINGLISTNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) VariableBindingListNoIN */
-   try {
-/*@egen*/
-   VariableBindingNoIN() (<COMMA> VariableBindingNoIN())*/*@bgen(jjtree)*/
-   } catch (Throwable jjte000) {
-     if (jjtc000) {
-       jjtree.clearNodeScope(jjtn000);
-       jjtc000 = false;
-     } else {
-       jjtree.popNode();
-     }
-     if (jjte000 instanceof RuntimeException) {
-       throw (RuntimeException)jjte000;
-     }
-     if (jjte000 instanceof ParseException) {
-       throw (ParseException)jjte000;
-     }
-     throw (Error)jjte000;
-   } finally {
-     if (jjtc000) {
-       jjtree.closeNodeScope(jjtn000, true);
-     }
-   }
-/*@egen*/
-}
-
-void VariableBinding ():
-{/*@bgen(jjtree) VariableBinding */
-  ASTVariableBinding jjtn000 = new ASTVariableBinding(this, JJTVARIABLEBINDING);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) VariableBinding */
-        try {
-/*@egen*/
-        TypedIdentifier() [VariableInitialisation()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void VariableBindingNoIN ():
-{/*@bgen(jjtree) VariableBindingNoIN */
-  ASTVariableBindingNoIN jjtn000 = new ASTVariableBindingNoIN(this, JJTVARIABLEBINDINGNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) VariableBindingNoIN */
-        try {
-/*@egen*/
-        TypedIdentifierNoIN() [VariableInitialisationNoIN()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-
-void VariableInitialisation ():
-{/*@bgen(jjtree) VariableInitialisation */
-  ASTVariableInitialisation jjtn000 = new ASTVariableInitialisation(this, JJTVARIABLEINITIALISATION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) VariableInitialisation */
-       try {
-/*@egen*/
-       <ASSIGN>  VariableInitializer ()/*@bgen(jjtree)*/
-       } catch (Throwable jjte000) {
-         if (jjtc000) {
-           jjtree.clearNodeScope(jjtn000);
-           jjtc000 = false;
-         } else {
-           jjtree.popNode();
-         }
-         if (jjte000 instanceof RuntimeException) {
-           throw (RuntimeException)jjte000;
-         }
-         if (jjte000 instanceof ParseException) {
-           throw (ParseException)jjte000;
-         }
-         throw (Error)jjte000;
-       } finally {
-         if (jjtc000) {
-           jjtree.closeNodeScope(jjtn000, true);
-         }
-       }
-/*@egen*/
-}
-
-void VariableInitialisationNoIN ():
-{/*@bgen(jjtree) VariableInitialisationNoIN */
-  ASTVariableInitialisationNoIN jjtn000 = new ASTVariableInitialisationNoIN(this, JJTVARIABLEINITIALISATIONNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) VariableInitialisationNoIN */
-       try {
-/*@egen*/
-       <ASSIGN>  VariableInitializerNoIN ()/*@bgen(jjtree)*/
-       } catch (Throwable jjte000) {
-         if (jjtc000) {
-           jjtree.clearNodeScope(jjtn000);
-           jjtc000 = false;
-         } else {
-           jjtree.popNode();
-         }
-         if (jjte000 instanceof RuntimeException) {
-           throw (RuntimeException)jjte000;
-         }
-         if (jjte000 instanceof ParseException) {
-           throw (ParseException)jjte000;
-         }
-         throw (Error)jjte000;
-       } finally {
-         if (jjtc000) {
-           jjtree.closeNodeScope(jjtn000, true);
-         }
-       }
-/*@egen*/
-}
-
-void VariableInitializer ():
-{/*@bgen(jjtree) VariableInitializer */
-  ASTVariableInitializer jjtn000 = new ASTVariableInitializer(this, JJTVARIABLEINITIALIZER);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) VariableInitializer */
-        try {
-/*@egen*/
-        LOOKAHEAD(3) AssignmentExpression ()
-    |                Attributes ()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void VariableInitializerNoIN ():
-{/*@bgen(jjtree) VariableInitializerNoIN */
-  ASTVariableInitializerNoIN jjtn000 = new ASTVariableInitializerNoIN(this, JJTVARIABLEINITIALIZERNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) VariableInitializerNoIN */
-        try {
-/*@egen*/
-        LOOKAHEAD(3) AssignmentExpressionNoIN ()
-    |                Attributes ()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-
-void TypedIdentifier ():
-{/*@bgen(jjtree) TypedIdentifier */
-  ASTTypedIdentifier jjtn000 = new ASTTypedIdentifier(this, JJTTYPEDIDENTIFIER);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) TypedIdentifier */
-        try {
-/*@egen*/
-        Identifier () [<COLON> TypeExpression()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void TypedIdentifierNoIN ():
-{/*@bgen(jjtree) TypedIdentifierNoIN */
-  ASTTypedIdentifierNoIN jjtn000 = new ASTTypedIdentifierNoIN(this, JJTTYPEDIDENTIFIERNOIN);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) TypedIdentifierNoIN */
-        try {
-/*@egen*/
-        Identifier () [<COLON> TypeExpressionNoIN()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Simple Variable Definition 
-/////////////////////////////////////////////////////
-void SimpleVariableDefinition ():
-{/*@bgen(jjtree) SimpleVariableDefinition */
-  ASTSimpleVariableDefinition jjtn000 = new ASTSimpleVariableDefinition(this, JJTSIMPLEVARIABLEDEFINITION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) SimpleVariableDefinition */
-        try {
-/*@egen*/
-        <VAR> UntypedVariableBindingList()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void UntypedVariableBindingList ():
-{/*@bgen(jjtree) UntypedVariableBindingList */
-  ASTUntypedVariableBindingList jjtn000 = new ASTUntypedVariableBindingList(this, JJTUNTYPEDVARIABLEBINDINGLIST);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) UntypedVariableBindingList */
-        try {
-/*@egen*/
-        UntypedVariableBinding() (<COMMA> UntypedVariableBinding())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void UntypedVariableBinding ():
-{/*@bgen(jjtree) UntypedVariableBinding */
-  ASTUntypedVariableBinding jjtn000 = new ASTUntypedVariableBinding(this, JJTUNTYPEDVARIABLEBINDING);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) UntypedVariableBinding */
-        try {
-/*@egen*/
-        Identifier() VariableInitialisation()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Function Definition
-/////////////////////////////////////////////////////
-void FunctionDefinition ():
-{/*@bgen(jjtree) FunctionDefinition */
-  ASTFunctionDefinition jjtn000 = new ASTFunctionDefinition(this, JJTFUNCTIONDEFINITION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) FunctionDefinition */
-        try {
-/*@egen*/
-        <FUNCTION> FunctionName() FunctionCommon()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void FunctionName ():
-{/*@bgen(jjtree) FunctionName */
-  ASTFunctionName jjtn000 = new ASTFunctionName(this, JJTFUNCTIONNAME);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) FunctionName */
-        try {
-/*@egen*/
-        // no line break after get
-        LOOKAHEAD(2) <GET> Identifier()
-        // no line break after get
-    |   LOOKAHEAD(2) <SET> Identifier()
-    |                 Identifier()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void FunctionCommon ():
-{/*@bgen(jjtree) FunctionCommon */
-  ASTFunctionCommon jjtn000 = new ASTFunctionCommon(this, JJTFUNCTIONCOMMON);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) FunctionCommon */
-        try {
-/*@egen*/
-        <LPAREN> [Parameters()] <RPAREN> [Result()] Block()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void Parameters ():
-{/*@bgen(jjtree) Parameters */
-  ASTParameters jjtn000 = new ASTParameters(this, JJTPARAMETERS);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) Parameters */
-        try {
-/*@egen*/
-        RestParameters()
-    |   ParameterInit() (<COMMA> ParameterInit())* [RestParameters()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void Parameter ():
-{/*@bgen(jjtree) Parameter */
-  ASTParameter jjtn000 = new ASTParameter(this, JJTPARAMETER);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) Parameter */
-        try {
-/*@egen*/
-        [<CONST>] TypedIdentifier()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void ParameterInit ():
-{/*@bgen(jjtree) ParameterInit */
-  ASTParameterInit jjtn000 = new ASTParameterInit(this, JJTPARAMETERINIT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ParameterInit */
-        try {
-/*@egen*/
-        Parameter() [<ASSIGN> AssignmentExpression()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void RestParameters ():
-{/*@bgen(jjtree) RestParameters */
-  ASTRestParameters jjtn000 = new ASTRestParameters(this, JJTRESTPARAMETERS);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) RestParameters */
-        try {
-/*@egen*/
-        <ELIPSE> [<CONST> Identifier()]/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void Result ():
-{/*@bgen(jjtree) Result */
-  ASTResult jjtn000 = new ASTResult(this, JJTRESULT);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) Result */
-        try {
-/*@egen*/
-        <COLON> TypeExpression()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Class Definition
-/////////////////////////////////////////////////////
-void ClassDefinition ():
-{/*@bgen(jjtree) ClassDefinition */
-  ASTClassDefinition jjtn000 = new ASTClassDefinition(this, JJTCLASSDEFINITION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) ClassDefinition */
-        try {
-/*@egen*/
-        <CLASS> Identifier() [Inheritance()] Block()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void InterfaceDefinition ():
-{/*@bgen(jjtree) InterfaceDefinition */
-  ASTInterfaceDefinition jjtn000 = new ASTInterfaceDefinition(this, JJTINTERFACEDEFINITION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) InterfaceDefinition */
-        try {
-/*@egen*/
-        LOOKAHEAD(3) <INTERFACE> Identifier() Sc()
-    |                <INTERFACE> Identifier() 
-                                 [<EXTENDS> TypeExpressionList()] Block()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-
-void Inheritance ():
-{/*@bgen(jjtree) Inheritance */
-  ASTInheritance jjtn000 = new ASTInheritance(this, JJTINHERITANCE);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) Inheritance */
-        try {
-/*@egen*/ 
-        <EXTENDS> TypeExpression() [<IMPLEMENTS> TypeExpressionList()]
-    |   <IMPLEMENTS> TypeExpressionList()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Namespace Definition 
-/////////////////////////////////////////////////////
-void NamespaceDefinition ():
-{/*@bgen(jjtree) NamespaceDefinition */
-  ASTNamespaceDefinition jjtn000 = new ASTNamespaceDefinition(this, JJTNAMESPACEDEFINITION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) NamespaceDefinition */
-        try {
-/*@egen*/
-        <NAMESPACE> Identifier()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-/////////////////////////////////////////////////////
-// Package Definition 
-/////////////////////////////////////////////////////
-void PackageDefinition ():
-{/*@bgen(jjtree) PackageDefinition */
-  ASTPackageDefinition jjtn000 = new ASTPackageDefinition(this, JJTPACKAGEDEFINITION);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) PackageDefinition */
-        try {
-/*@egen*/
-        <PACKAGE> [PackageName()] Block()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void PackageName ():
-{/*@bgen(jjtree) PackageName */
-  ASTPackageName jjtn000 = new ASTPackageName(this, JJTPACKAGENAME);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) PackageName */
-        try {
-/*@egen*/
-        <STRING_LITERAL>
-    |   PackageIdentifiers()/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
-
-void PackageIdentifiers ():
-{/*@bgen(jjtree) PackageIdentifiers */
-  ASTPackageIdentifiers jjtn000 = new ASTPackageIdentifiers(this, JJTPACKAGEIDENTIFIERS);
-  boolean jjtc000 = true;
-  jjtree.openNodeScope(jjtn000);
-/*@egen*/}
-{/*@bgen(jjtree) PackageIdentifiers */
-        try {
-/*@egen*/
-        Identifier() (<DOT> Identifier())*/*@bgen(jjtree)*/
-        } catch (Throwable jjte000) {
-          if (jjtc000) {
-            jjtree.clearNodeScope(jjtn000);
-            jjtc000 = false;
-          } else {
-            jjtree.popNode();
-          }
-          if (jjte000 instanceof RuntimeException) {
-            throw (RuntimeException)jjte000;
-          }
-          if (jjte000 instanceof ParseException) {
-            throw (ParseException)jjte000;
-          }
-          throw (Error)jjte000;
-        } finally {
-          if (jjtc000) {
-            jjtree.closeNodeScope(jjtn000, true);
-          }
-        }
-/*@egen*/
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/js2.0.jjt b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/js2.0.jjt
deleted file mode 100644
index 28035bc..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascript20parser/js2.0.jjt
+++ /dev/null
@@ -1,1501 +0,0 @@
-options {
-    STATIC=false;
-    MULTI=true;
-    VISITOR=true;
-    NODE_USES_PARSER=true;
-    DEBUG_TOKEN_MANAGER=false;
-    DEBUG_PARSER=false;
-}
-
-PARSER_BEGIN(JSParser20)
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser;
-import java.io.IOException;
-public class JSParser20 
-{
-    //
-    // This is the root node for the parse tree (root DOM node, tree of SimpleNode(s))
-    //
-    protected ASTProgram _jjtRoot;
-    
-    public ASTProgram getRootNode()
-    {
-    	return _jjtRoot;
-    }
-    
-}
-
-PARSER_END(JSParser20)
-
-
-
-/////////////////////////////////////////////////////
-// LEXICAL RULES Section
-/////////////////////////////////////////////////////
-TOKEN_MGR_DECLS :
-{
-    private boolean isRegValid = true;
-    public void setRegInvalid()
-    {
-        isRegValid = false;
-    }
-    public void setRegValid()
-    {
-        isRegValid = true;
-    }
-}
-
-/////////////////////////////////////////////////////
-// WHITE SPACE 
-/////////////////////////////////////////////////////
-SPECIAL_TOKEN :
-{
-        <EOL:   (["\n","\r"])+ >
-    |   <WS:    ([" ","\t"])+ >
-}
-/////////////////////////////////////////////////////
-// COMMENTS 
-/////////////////////////////////////////////////////
-MORE :
-{
-        "//" : IN_SINGLE_LINE_COMMENT
-    |   "/*" : IN_MULTI_LINE_COMMENT
-}
-
-<IN_SINGLE_LINE_COMMENT>
-SPECIAL_TOKEN :
-{
-        < SINGLE_LINE_COMMENT: (~["\n","\r"])* ("\n"|"\r"|"\r\n")? >  : DEFAULT
-}
-
-<IN_MULTI_LINE_COMMENT>
-SPECIAL_TOKEN :
-{
-        <MULTI_LINE_COMMENT: "*/" > : DEFAULT
-}
-
-<IN_SINGLE_LINE_COMMENT, IN_MULTI_LINE_COMMENT>
-MORE :
-{
-        < ~[] >
-}
-/////////////////////////////////////////////////////
-// RESERVED WORDS AND LITERALS
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < AS:           "as"         >
-    |   < BREAK:        "break"      >
-    |   < CASE:         "case"       >
-    |   < CATCH:        "catch"      >
-    |   < CLASS:        "class"      >
-    |   < CONST:        "const"      >
-    |   < CONTINUE:     "continue"   >
-    |   < _DEFAULT:     "default"    >
-    |   < DELETE:       "delete"     >
-    |   < DO:           "do"         >
-    |   < ELSE:         "else"       >
-    |   < EXTENDS:      "extends"    >
-    |   < FALSE:        "false"      >   
-    |   < FINALLY:      "finally"    >
-    |   < FOR:          "for"        >
-    |   < FUNCTION:     "function"   >
-    |   < FUNCTION_:    "Function"   >
-    |   < GET:          "get"        >
-    |   < IF:           "if"         >
-    |   < IN:           "in"         >
-    |   < INCLUDE:      "include"    >
-    |   < INSTANCEOF:   "instanceof" >
-    |   < IS:           "is"         >
-    |   < NAMESPACE:    "namespace"  >
-    |   < NEW:          "new"        >
-    |   < NULL:         "null"       >    
-    |   < PACKAGE:      "package"    > 
-    |   < PRIVATE:      "private"    >
-    |   < PUBLIC:       "public"     >
-    |   < RETURN:       "return"     >
-    |   < SET:          "set"        >
-    |   < SUPER:        "super"      >
-    |   < SWITCH:       "switch"     >
-    |   < THIS:         "this"       >
-    |   < THROW:        "throw"      >
-    |   < TRUE:         "true"       > 
-    |   < TRY:          "try"        >
-    |   < TYPEOF:       "typeof"     >
-    |   < USE:          "use"        >
-    |   < VAR:          "var"        >
-    |   < VOID:         "void"       >
-    |   < WHILE:        "while"      >
-    |   < WITH:         "with"       >
-}
-/////////////////////////////////////////////////////
-// FUTURE RESERVED WORDS
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < ABSTRACT:     "abstract"     >
-    |   < DEBUGGER:     "debugger"     >
-    |   < ENUM:         "enum"         >
-    |   < EXPORT:       "export"       >
-    |   < GOTO:         "goto"         >
-    |   < IMPLEMENTS:   "implements"   >
-    |   < INTERFACE:    "interface"    >
-    |   < NATIVE:       "native"       >
-    |   < PROTECTED:    "protected"    >
-    |   < SYNCHRONIZED: "synchronized" >
-    |   < THROWS:       "throws"       >
-    |   < TRANSIENT:    "transient"    >
-    |   < VOLATILE:     "volatile"     >
-    |   < IMPORT:       "import"       >
-}
-/////////////////////////////////////////////////////
-// LITERALS 
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* >
-    |   < HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ >
-    |   < OCTAL_LITERAL: "0" (["0"-"7"])* >
-    |   < FLOATING_POINT_LITERAL: (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? 
-                                |   "." (["0"-"9"])+ (<EXPONENT>)? 
-                                |   (["0"-"9"])+ (<EXPONENT>)? 
-        >
-    |   < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
-    |   < STRING_LITERAL:   "\""  
-                            ( (~["\"","\\","\n","\r"]) | <ESCAPE_SEQUENCE> )* 
-                            "\""
-                        |   "\"" 
-                            ( (~["\"","\\"]) | "\\" ("\n" | "\r" | "\r\n") | <ESCAPE_SEQUENCE> )* 
-                            "\""  
-                        |   "'"
-                            ( (~["'","\\","\n","\r"]) | <ESCAPE_SEQUENCE> )*
-                            "'"
-        >
-    |   < #ESCAPE_SEQUENCE: 
-            "\\"
-            (       ["n","t","b","r","f","\\","'","\"","[","]"]
-                |   ["0"-"7"] ( ["0"-"7"] )?
-                |   ["0"-"3"] ["0"-"7"] ["0"-"7"]
-                |   ["x"] ["0"-"9","a"-"f","A"-"F"] ["0"-"9","a"-"f","A"-"F"]
-                |   ["u"] ["0"-"9","a"-"f","A"-"F"] ["0"-"9","a"-"f","A"-"F"] 
-                          ["0"-"9","a"-"f","A"-"F"] ["0"-"9","a"-"f","A"-"F"]
-            )
-        >
-    |   < UNTERMINATED_STRING_LITERAL:
-                "\"" ( (~["\"","\\","\n","\r"]) | <ESCAPE_SEQUENCE> )* ( ["\n","\r"] )?
-            |   "'"  ( (~["'","\\","\n","\r"])  | <ESCAPE_SEQUENCE> )* ( ["\n","\r"] )?
-        >
-}
-/////////////////////////////////////////////////////
-// REGULAR EXPRESSIONS 
-/////////////////////////////////////////////////////
-TOKEN :
-{ 
-        < #REGX_START_CHAR : ~["\r","\n","/","=","*"] | "\\/">
-    |   < #REGX_BODY_CHAR_EXCLUSION : ~["\r","\n","/"] >  
-    |   < #REGX_BODY_CHAR : ( <REGX_BODY_CHAR_EXCLUSION> | "\\/" ) >
-    |   < #REGEX_END_CHAR :     "i" 
-                            |   "g" 
-                            |   "m" 
-                            |   "ig" 
-                            |   "im" 
-                            |   "gi" 
-                            |   "gm" 
-                            |   "mi" 
-                            |   "mg" 
-                            |   "igm" 
-                            |   "img" 
-                            |   "gmi" 
-                            |   "gim" 
-                            |   "mig" 
-                            |   "mgi" 
-                            
-        >
-}
-
-TOKEN :
-{
-        <REGULAR_EXPRESSION : "/" <REGX_START_CHAR> (<REGX_BODY_CHAR>)* "/"  (<REGEX_END_CHAR>)? >
-        {
-           try {
-                // Peek at the next character.
-                char nextCh = input_stream.readChar();
-                input_stream.backup(1);
-                if (isRegValid == false || nextCh == '/' || nextCh == '*') {
-                    //
-                    // Lexecal analyser thinks it is a RE
-                    // operator such as /...../
-                    // Put the everything to the first "/" back on the input stream
-                    //
-                    input_stream.backup(lengthOfMatch-1);
-                    //
-                    // And remove it from the token
-                    //
-                    matchedToken.image = matchedToken.image.substring(0, 1);
-                    image.delete(0, image.length() - 1);
-                    image.append('/');
-                    matchedToken.kind=SLASH;
-                }
-               } catch (IOException e) {
-                    throw new Error(e.toString());
-               }
-       }        
-        
-}
-/////////////////////////////////////////////////////
-// IDENTIFIERS 
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
-    |   < #LETTER: ["a"-"z","A"-"Z","$","_"] >
-    |   < #DIGIT: ["0"-"9"]>
-}
-/////////////////////////////////////////////////////
-// SEPARATORS 
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < LPAREN:    "("   >
-    |   < RPAREN:    ")"   >
-    |   < LBRACE:    "{"   >
-    |   < RBRACE:    "}"   >
-    |   < LBRACKET:  "["   >
-    |   < RBRACKET:  "]"   >
-    |   < SEMICOLON: ";"   >
-    |   < COMMA:     ","   >
-    |   < DOT:       "."   >
-    |   < QUALIFIER: "::"  >
-    |   < ELIPSE:    "..." >
-}
-
-/////////////////////////////////////////////////////
-// OPERATORS 
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < ASSIGN:               "="    >
-    |   < GT:                   ">"    >
-    |   < LT:                   "<"    >
-    |   < BANG:                 "!"    >
-    |   < TILDE:                "~"    >
-    |   < HOOK:                 "?"    >
-    |   < COLON:                ":"    >
-    |   < EQ:                   "=="   >
-    |   < LE:                   "<="   >
-    |   < GE:                   ">="   >
-    |   < NE:                   "!="   >
-    |   < SC_OR:                "||"   >
-    |   < SC_AND:               "&&"   >
-    |   < SC_XOR:               "^^"   >
-    |   < INCR:                 "++"   >
-    |   < DECR:                 "--"   >
-    |   < PLUS:                 "+"    >
-    |   < MINUS:                "-"    >
-    |   < STAR:                 "*"    >
-    |   < SLASH:                "/"    >
-    |   < BIT_AND:              "&"    >
-    |   < BIT_OR:               "|"    >
-    |   < XOR:                  "^"    >
-    |   < REM:                  "%"    >
-    |   < LSHIFT:               "<<"   >
-    |   < RSIGNEDSHIFT:         ">>"   >
-    |   < RUNSIGNEDSHIFT:       ">>>"  >
-    |   < PLUSASSIGN:           "+="   >
-    |   < MINUSASSIGN:          "-="   >
-    |   < STARASSIGN:           "*="   >
-    |   < SLASHASSIGN:          "/="   >
-    |   < ANDASSIGN:            "&="   >
-    |   < ORASSIGN:             "|="   >
-    |   < XORASSIGN:            "^="   >
-    |   < REMASSIGN:            "%="   >
-    |   < LSHIFTASSIGN:         "<<="  >
-    |   < RSIGNEDSHIFTASSIGN:   ">>="  >
-    |   < RUNSIGNEDSHIFTASSIGN: ">>>=" >
-    |   < SC_ORASSIGN:          "||="  >
-    |   < SC_ANDASSIGN:         "&&="  >
-    |   < SC_XORASSIGN:         "^^="  >
-    |   < IDENTITYOPER:         "==="  >
-    |   < NOTIDENTITYOPER:      "!=="  >
-}
-///////////////////////////////////////////////////////////////////
-// GRAMMAR Section
-///////////////////////////////////////////////////////////////////
-
-Token Program():
-{
-        Token retval = getToken(1);
-}
-{
-        (PackageDefinition())* [Directives()] <EOF>
-        {
-            _jjtRoot = jjtThis;
-            return retval;
-        }
-}
-
-/////////////////////////////////////////////////////
-// Expressions 
-/////////////////////////////////////////////////////
-
-/////////////////////////////////////////////////////
-// Identifier 
-/////////////////////////////////////////////////////
-void Identifier():
-{}
-{
-        <IDENTIFIER>
-    |   <GET>
-    |   <SET>
-    |   <INCLUDE>
-//    |   <NAMESPACE>
-}
-
-/////////////////////////////////////////////////////
-// Qualified Identifier 
-/////////////////////////////////////////////////////
-void SimpleQualifiedIdentifier():
-{}
-{
-       Identifier() [<QUALIFIER> Identifier()]
-    |  ReservedNamespace() [<QUALIFIER> Identifier()] 
-}
-
-void ExpressionQualifiedIdentifier():
-{}
-{
-       <LPAREN> AssignmentExpression() <RPAREN> <QUALIFIER> Identifier()
-}
-
-void QualifiedIdentifier():
-{}
-{
-       SimpleQualifiedIdentifier()
-    |  ExpressionQualifiedIdentifier()
-}
-
-/////////////////////////////////////////////////////
-// Primary Expressions
-/////////////////////////////////////////////////////
-void PrimaryExpression ():
-{}
-{
-    (
-        <NULL>
-    |   <TRUE>
-    |   <FALSE>
-    |   <DECIMAL_LITERAL> 
-    |   <OCTAL_LITERAL>
-    |   <HEX_LITERAL>
-    |   <FLOATING_POINT_LITERAL> 
-    |   <STRING_LITERAL> 
-    |   <THIS>
-    |   <REGULAR_EXPRESSION>
-    |   <LPAREN> ListExpression() <RPAREN>
-    |   ArrayLiteral()
-    |   ObjectLiteral()
-    |   FunctionExpression()
-    )
-    {
-        token_source.setRegValid();
-    }
-}
-
-void ReservedNamespace ():
-{}
-{
-       <PUBLIC>
-    |  <PROTECTED>
-    |  <PRIVATE>
-}
-
-/////////////////////////////////////////////////////
-// Function Expression
-/////////////////////////////////////////////////////
-void  FunctionExpression ():
-{}
-{
-        LOOKAHEAD(2) <FUNCTION> FunctionCommon()
-    |                <FUNCTION> Identifier() FunctionCommon()
-}
-
-/////////////////////////////////////////////////////
-// Object Literals
-/////////////////////////////////////////////////////
-void ObjectLiteral ():
-{}
-{
-        <LBRACE> [FieldList()] <RBRACE>  
-}        
-
-void FieldList():
-{}
-{
-        LiteralField() (<COMMA> LiteralField())*
-}
-
-void LiteralField ():
-{}
-{
-        FieldName() <COLON> AssignmentExpression()
-}
-
-void FieldName ():
-{}
-{
-        <STRING_LITERAL>
-    |   <DECIMAL_LITERAL>
-    |   SimpleQualifiedIdentifier()
-    |   <LPAREN> AssignmentExpression() <RPAREN> [<QUALIFIER> Identifier()]
-}	
-
-/////////////////////////////////////////////////////
-// Array Literal
-/////////////////////////////////////////////////////
-void ArrayLiteral():
-{}
-{
-        <LBRACKET> [ElementList()] <RBRACKET>
-}
-
-void ElementList():
-{}
-{
-        LiteralElement() (<COMMA> LiteralElement())*
-}
-
-void LiteralElement():
-{}
-{
-        AssignmentExpression()
-}
-
-/////////////////////////////////////////////////////
-// Super Expression
-/////////////////////////////////////////////////////
-void SuperExpression ():
-{}
-{
-        <SUPER> [LOOKAHEAD(2) <LPAREN> AssignmentExpression() <RPAREN>]
-}
-
-/////////////////////////////////////////////////////
-// Postfix Expression
-/////////////////////////////////////////////////////
-void PostfixExpression ():
-{}
-{
-        AttributeExpression ()                            [PostfixOp()]
-    |   {token_source.setRegInvalid();} 
-        FullPostfixExpression () (PropertyOrArguments())* [PostfixOp()]
-    |   SuperExpression()         PropertyOperator()
-}    
-
-void AttributeExpression ():
-{}
-{
-        SimpleQualifiedIdentifier()  (PropertyOrArguments())*
-}
-
-void FullPostfixExpression ():
-{}
-{
-       LOOKAHEAD(<LPAREN> AssignmentExpression() <RPAREN> <QUALIFIER>) 
-       ExpressionQualifiedIdentifier()
-    |  PrimaryExpression() 
-    |  FullNewExpression()             
-}
-
-void FullNewExpression ():
-{}
-{
-        <NEW> FullNewSubexpression()  (LOOKAHEAD(2) PropertyOperator())* [LOOKAHEAD(2) Arguments()]
-}
-
-void FunctionConstructor():
-{}
-{    
-        <FUNCTION_> Arguments()
-}
-
-void FullNewSubexpression ():
-{}
-{
-        LOOKAHEAD(<LPAREN> AssignmentExpression() <RPAREN> <QUALIFIER>) 
-        ExpressionQualifiedIdentifier()        
-    |   PrimaryExpression() 
-    |   SimpleQualifiedIdentifier()
-    |   SuperExpression() 
-    |   FullNewExpression()
-    |   FunctionConstructor()
-}
-
-
-void PostfixOp():
-{}
-{
-        <INCR>
-    |   <DECR>
-}
-
-void PropertyOrArguments ():
-{}
-{
-        Arguments()        
-    |   PropertyOperator()
-}
-
-/////////////////////////////////////////////////////
-// Property Operators
-/////////////////////////////////////////////////////
-void PropertyOperator ():
-{}
-{          
-        <DOT>      QualifiedIdentifier()
-    |   LOOKAHEAD(2) <LBRACKET> <RBRACKET>
-    |   LOOKAHEAD(2) <LBRACKET> <ELIPSE> AssignmentExpression() <RBRACKET>
-    |                <LBRACKET> ListExpression() [<ELIPSE> AssignmentExpression()] <RBRACKET>
-}
-
-void Arguments ():
-{{token_source.setRegValid();}}
-{
-        LOOKAHEAD(2) <LPAREN> <RPAREN>
-    |   LOOKAHEAD(2) <LPAREN> <ELIPSE> AssignmentExpression() <RPAREN>
-    |                <LPAREN> ListExpression() [<ELIPSE> AssignmentExpression()] <RPAREN>
-}
-
-/////////////////////////////////////////////////////
-// Unary Operators 
-/////////////////////////////////////////////////////
-void UnaryExpression ():
-{}
-{
-                 PostfixExpression()
-    |   <DELETE> PostfixExpression()
-    |   <VOID>   UnaryExpression()
-    |   <TYPEOF> UnaryExpression()
-    |   <INCR>   PostfixExpression()
-    |   <DECR>   PostfixExpression()
-    |   <PLUS>   UnaryExpression()
-    |   <MINUS>  UnaryExpression()
-    |   <TILDE>  UnaryExpression()
-    |   <BANG>   UnaryExpression()
-}
-
-/////////////////////////////////////////////////////
-// Multiplicative Operators 
-/////////////////////////////////////////////////////
-void MulOp():
-{}
-{
-        <STAR>
-    |   <SLASH>
-    |   <REM> 
-}
-
-void MultiplicativeExpression():
-{}
-{
-        UnaryExpression() (MulOp() UnaryExpression())*
-
-}
-
-/////////////////////////////////////////////////////
-// Additive Operators 
-/////////////////////////////////////////////////////
-void AddOp():
-{}
-{
-        <PLUS>
-    |   <MINUS>
-}
-
-void AdditiveExpression():
-{}
-{
-        MultiplicativeExpression() (AddOp() MultiplicativeExpression())*
-} 
-
-/////////////////////////////////////////////////////
-// Bitwise Shift Operators 
-/////////////////////////////////////////////////////
-void ShiftOp():
-{}
-{
-        <LSHIFT>
-    |   <RSIGNEDSHIFT>
-    |   <RUNSIGNEDSHIFT>
-}
-
-void ShiftExpression():
-{}
-{
-        AdditiveExpression() (ShiftOp() AdditiveExpression())*
-}
-
-/////////////////////////////////////////////////////
-// Relational Operators 
-/////////////////////////////////////////////////////
-void RelOp():
-{}
-{
-        <LT>
-    |   <GT> 
-    |   <LE> 
-    |   <GE>
-    |   <IS>
-    |   <AS>
-}
-
-void RelationalExpression():
-{}
-{
-        ShiftExpression() 
-            (LOOKAHEAD(3)(RelOp() | <IN> | <INSTANCEOF> ) ShiftExpression())*
-}
-
-void RelationalExpressionNoIN():
-{}
-{
-        ShiftExpression() 
-            ((RelOp() | <INSTANCEOF>)  ShiftExpression())*
-}
-
-/////////////////////////////////////////////////////
-// Equality Operators 
-/////////////////////////////////////////////////////
-void EqualOp():
-{}
-{
-        <EQ> 
-    |   <NE> 
-    |   <IDENTITYOPER> 
-    |   <NOTIDENTITYOPER>
-}
-
-void EqualityExpression():
-{}
-{
-        RelationalExpression() (EqualOp() RelationalExpression())*
-}
-
-void EqualityExpressionNoIN():
-{}
-{
-        RelationalExpressionNoIN() (EqualOp() RelationalExpressionNoIN())*
-}
-
-/////////////////////////////////////////////////////
-// Binary Bitwise Operators 
-/////////////////////////////////////////////////////
-void BitwiseANDOp():
-{}
-{
-        <BIT_AND>
-}
-
-void BitwiseANDExpression():
-{}
-{
-        EqualityExpression() (BitwiseANDOp() EqualityExpression())*
-}
-
-void BitwiseANDExpressionNoIN():
-{}
-{
-        EqualityExpressionNoIN() (BitwiseANDOp() EqualityExpressionNoIN())*
-}
-
-
-void BitwiseXOROp():
-{}
-{
-        <XOR>
-}
-
-void BitwiseXORExpression():
-{}
-{
-        BitwiseANDExpression() (BitwiseXOROp() BitwiseANDExpression())*
-}
-
-void BitwiseXORExpressionNoIN():
-{}
-{
-        BitwiseANDExpressionNoIN() (BitwiseXOROp() BitwiseANDExpressionNoIN())*
-}
-
-void BitwiseOROp():
-{}
-{
-        <BIT_OR>
-}
-
-void BitwiseORExpression():
-{}
-{
-        BitwiseXORExpression() (BitwiseOROp() BitwiseXORExpression())*
-}
-
-void BitwiseORExpressionNoIN():
-{}
-{
-        BitwiseXORExpressionNoIN() (BitwiseOROp() BitwiseXORExpressionNoIN())*
-}
-
-/////////////////////////////////////////////////////
-// Binary Logical Operators 
-/////////////////////////////////////////////////////
-void LogicalANDExpression():
-{}
-{
-        BitwiseORExpression() (<SC_AND> BitwiseORExpression())*
-}
-
-void LogicalANDExpressionNoIN():
-{}
-{
-        BitwiseORExpressionNoIN() (<SC_AND> BitwiseORExpressionNoIN())*
-}
-
-void LogicalORExpression():
-{}
-{
-        LogicalANDExpression() (<SC_OR> LogicalANDExpression())*
-}
-
-void LogicalORExpressionNoIN():
-{}
-{
-        LogicalANDExpressionNoIN() (<SC_OR> LogicalANDExpressionNoIN())*
-}
-
-/////////////////////////////////////////////////////
-// Conditional Operators 
-/////////////////////////////////////////////////////
-void ConditionalExpression():
-{}
-{
-        LogicalORExpression() [<HOOK>  AssignmentExpression() 
-                               <COLON> AssignmentExpression()]
-}
-
-void ConditionalExpressionNoIN():
-{}
-{
-        LogicalORExpressionNoIN()  [<HOOK>  AssignmentExpressionNoIN() 
-                                    <COLON> AssignmentExpressionNoIN()]
-}
-
-void NonAssignmentExpression():
-{}
-{
-        LogicalORExpression() [<HOOK>  NonAssignmentExpression() 
-                               <COLON> NonAssignmentExpression()]
-}
-
-void NonAssignmentExpressionNoIN():
-{}
-{
-        LogicalORExpressionNoIN() [<HOOK>  NonAssignmentExpressionNoIN() 
-                                   <COLON> NonAssignmentExpressionNoIN()]
-}
-
-/////////////////////////////////////////////////////
-// Assignment Operators 
-/////////////////////////////////////////////////////
-void AssignementOperator():
-{}
-{
-        <ASSIGN>
-    |   <STARASSIGN>
-    |   <SLASHASSIGN> 
-    |   <REMASSIGN> 
-    |   <PLUSASSIGN>
-    |   <MINUSASSIGN> 
-    |   <LSHIFTASSIGN> 
-    |   <RSIGNEDSHIFTASSIGN>
-    |   <RUNSIGNEDSHIFTASSIGN>
-    |   <ANDASSIGN> 
-    |   <XORASSIGN> 
-    |   <ORASSIGN>
-    |   <SC_ANDASSIGN>
-    |   <SC_XORASSIGN>
-    |   <SC_ORASSIGN>
- 
-}
-
-void AssignmentExpression():
-{}
-{
-        ConditionalExpression() [LOOKAHEAD(2) AssignementOperator() AssignmentExpression()]
-}
-
-void AssignmentExpressionNoIN():
-{}
-{
-        ConditionalExpressionNoIN() [LOOKAHEAD(2) AssignementOperator() AssignmentExpressionNoIN()]
-}
-
-/////////////////////////////////////////////////////
-// Comma Expressions
-/////////////////////////////////////////////////////
-void ListExpression ():
-{}
-{
-        AssignmentExpression() (<COMMA> AssignmentExpression())*
-}   
-
-void ListExpressionNoIN ():
-{}
-{
-        AssignmentExpressionNoIN() (<COMMA> AssignmentExpressionNoIN())*
-}   
-
-/////////////////////////////////////////////////////
-// Type Expressions
-/////////////////////////////////////////////////////
-void TypeExpression ():
-{}
-{
-        NonAssignmentExpression()
-}
-
-void TypeExpressionNoIN ():
-{}
-{
-        NonAssignmentExpressionNoIN()
-}
-
-void TypeExpressionList ():
-{}
-{
-        NonAssignmentExpression() (<COMMA> NonAssignmentExpression())*
-}
-/////////////////////////////////////////////////////
-// Staements (abbrev, noShortIf, full) 
-/////////////////////////////////////////////////////
-void Statement ():
-{}
-{
-        LOOKAHEAD(3) ExpressionStatement() Sc()
-    |                SuperStatement() Sc()
-    |                Block()
-    |                LabeledStatement()
-    |                IfStatement()
-    |                SwitchStatement()
-    |                DoStatement() Sc()
-    |                WhileStatement()
-    |                ForStatement()
-    |                WithStatement()
-    |                ContinueStatement() Sc()
-    |                BreakStatement() Sc()
-    |                ReturnStatement() Sc()
-    |                ThrowStatement() Sc()
-    |                TryStatement()
-}
-
-void Substatement ():
-{}
-{
-                     EmptyStatement()
-    |   LOOKAHEAD(2) Statement()
-    |                SimpleVariableDefinition() Sc()
-    |                Attributes()               <LBRACE> Substatements() <RBRACE>
-}
-
-void Substatements ():
-{}
-{
-        (Substatement())+
-}
-
-JAVACODE
-  void Sc() {
-    Token tok = getToken(1);
-    if (tok.kind == SEMICOLON) {
-       tok = getNextToken();
-    } else if (tok.specialToken != null) {
-       if (!EolCommentSkipWs(tok.specialToken) && (tok.kind != EOF)) {
-          throw generateParseException();
-       }
-    } else if ((tok.kind != EOF) && (tok.kind!=RBRACE)) {
-         throw generateParseException();
-    }
-  }
- 
-JAVACODE
-  boolean EolCommentSkipWs(Token t) {
-    boolean retVal = false;
-    Token specialToken = t;
-    while(specialToken != null) {
-      if(specialToken.kind == WS) {
-        specialToken = specialToken.specialToken;
-        continue;
-      }
-      else if(specialToken.kind == EOL  ||
-              specialToken.kind == SINGLE_LINE_COMMENT) {
-        retVal = true;
-        break;
-      }
-      else {
-        break;
-      }
-    }
-    return retVal;
-  }
- 
-/////////////////////////////////////////////////////
-// Empty Statement 
-/////////////////////////////////////////////////////
-void EmptyStatement():
-{}
-{
-        <SEMICOLON>
-}
-
-/////////////////////////////////////////////////////
-// Expresion Statement 
-/////////////////////////////////////////////////////
-void ExpressionStatement():
-{}
-{
-        ListExpression() 
-}
-
-/////////////////////////////////////////////////////
-// Super Statement 
-/////////////////////////////////////////////////////
-void SuperStatement ():
-{}
-{
-        <SUPER> Arguments()
-}
-
-/////////////////////////////////////////////////////
-// Block Statement 
-/////////////////////////////////////////////////////
-void Block ():
-{}
-{   
-        <LBRACE> [Directives()] <RBRACE>
-}
-
-/////////////////////////////////////////////////////
-// Labeled Statement (maps to literal field)
-/////////////////////////////////////////////////////
-void LabeledStatement ():
-{}
-{
-        Identifier() <COLON> Substatement()
-}
-
-/////////////////////////////////////////////////////
-// If Statement 
-/////////////////////////////////////////////////////
-void IfStatement():
-{}
-{
-        <IF> <LPAREN> ListExpression() <RPAREN> 
-            Substatement() 
-            [LOOKAHEAD(1) <ELSE> Substatement()]
-}
-
-/////////////////////////////////////////////////////
-// Switch Statement 
-/////////////////////////////////////////////////////
-void SwitchStatement ():
-{}
-{
-        <SWITCH> <LPAREN> ListExpression() <RPAREN>
-                 <LBRACE> [CaseElements()] <RBRACE>
-}
-
-void CaseElements ():
-{}
-{
-        CaseLabel() (CaseElement())*
-}
-
-void CaseElement ():
-{}
-{
-        Directive()
-    |   CaseLabel()
-}
-
-void CaseLabel ():
-{}
-{
-        <CASE> ListExpression() <COLON>
-    |   <_DEFAULT> <COLON>
-}
-
-/////////////////////////////////////////////////////
-// Do-While Statement 
-/////////////////////////////////////////////////////
-void DoStatement(): 
-{}
-{
-        <DO> Substatement() <WHILE> <LPAREN> ListExpression() <RPAREN>
-}
-
-/////////////////////////////////////////////////////
-// While Statement
-/////////////////////////////////////////////////////
-void WhileStatement ():
-{}
-{
-        <WHILE> <LPAREN> ListExpression() <RPAREN>
-           Substatement()
-}
-
-/////////////////////////////////////////////////////
-// For Statements 
-/////////////////////////////////////////////////////
-void ForStatement ():
-{}
-{
-         LOOKAHEAD(<FOR> <LPAREN> ForInBinding() <IN>)
-                   <FOR> <LPAREN> ForInBinding() <IN> ListExpression() <RPAREN>
-                      Substatement()
-    |              <FOR> <LPAREN> [ForInitializer()] <SEMICOLON> 
-                       [ListExpression()] <SEMICOLON> 
-                       [ListExpression()] <RPAREN> 
-                      Substatement()
-}
-
-void ForInitializer ():
-{}
-{
-        LOOKAHEAD(3) ListExpressionNoIN()
-    |                VariableDefinitionNoIN()
-    |                Attributes()             VariableDefinitionNoIN()
-}
-
-void ForInBinding ():
-{}
-{
-        LOOKAHEAD(3) PostfixExpression()
-    |                VariableDefinitionKind() VariableBindingNoIN()
-    |                Attributes()             VariableDefinitionKind() VariableBindingNoIN()
-}
-
-/////////////////////////////////////////////////////
-// With Statement 
-/////////////////////////////////////////////////////
-void WithStatement():
-{}
-{
-        <WITH> <LPAREN> ExpressionStatement() <RPAREN>
-            Substatement()
-}
-
-/////////////////////////////////////////////////////
-// Continue and Break Statement
-/////////////////////////////////////////////////////
-void ContinueStatement():
-{}
-{
-        <CONTINUE> [Identifier()]
-}
-
-void BreakStatement():
-{}
-{
-        <BREAK> [Identifier()]
-}
- 
-
-/////////////////////////////////////////////////////
-// Return Statement
-/////////////////////////////////////////////////////
-void ReturnStatement():
-{}
-{
-        <RETURN> [ListExpression()]
-}
-
-/////////////////////////////////////////////////////
-// Throw Statement
-/////////////////////////////////////////////////////
-void ThrowStatement():
-{}
-{
-        <THROW> ListExpression()
-}
-
-/////////////////////////////////////////////////////
-// Try Statement
-/////////////////////////////////////////////////////
-void TryStatement():
-{}
-{
-        <TRY> Block()
-        (<CATCH> <LPAREN> Identifier() <RPAREN> Block())*
-        [<FINALLY> Block()]
-} 
- 
-/////////////////////////////////////////////////////
-// Directives 
-/////////////////////////////////////////////////////
-void Directives ():
-{}
-{
-        (Directive())+
-}
-
-void Directive ():
-{}
-{
-                      EmptyStatement()
-     |   LOOKAHEAD(3) Statement()
-     |   LOOKAHEAD(2) AnnotatableDirective()
-     |   LOOKAHEAD(2) Attributes()            <LBRACE> Directives() <RBRACE>
-     |   LOOKAHEAD(2) Attributes()            AnnotatableDirective() 
-     |                IncludeDirective()      Sc()
-     |                Pragma()                Sc()
-}
-
-void AnnotatableDirective ():
-{}
-{
-         VariableDefinition() Sc()
-     |   FunctionDefinition()
-     |   ClassDefinition()
-     |   InterfaceDefinition()
-     |   NamespaceDefinition() Sc()
-     |   ImportDirective() Sc()
-     |   ExportDefinition() Sc()
-     |   UseDirective() Sc()
-}
-/////////////////////////////////////////////////////
-// Attributes
-/////////////////////////////////////////////////////
-void Attributes ():
-{}
-{
-        (Attribute ())+
-}
-
-void Attribute ():
-{}
-{
-                     AttributeExpression()
-    |                <TRUE>
-    |                <FALSE>
-}
-
-/////////////////////////////////////////////////////
-// Use Directive
-/////////////////////////////////////////////////////
-void UseDirective ():
-{}
-{ 
-        <USE> <NAMESPACE> <LPAREN> ListExpression() <RPAREN>
-}
-
-/////////////////////////////////////////////////////
-// Import Directive
-/////////////////////////////////////////////////////
-void ImportDirective ():
-{}
-{
-        LOOKAHEAD(3) <IMPORT> PackageName()
-    |                <IMPORT> Identifier() <ASSIGN> PackageName()
-}
-
-/////////////////////////////////////////////////////
-// Include Directive
-/////////////////////////////////////////////////////
-void IncludeDirective (): 
-{}
-{
-        <INCLUDE> <STRING_LITERAL>
-}
-
-/////////////////////////////////////////////////////
-// Pragma
-/////////////////////////////////////////////////////
-void Pragma ():
-{}
-{
-        <USE> PragmaItems()
-}
-
-void PragmaItems ():
-{}
-{
-        PragmaItem() (<COMMA> PragmaItem())
-}
-
-void PragmaItem ():
-{}
-{
-        PragmaExpr() [<HOOK>]
-}
-
-
-void PragmaExpr ():
-{}
-{
-        Identifier() [<LPAREN> PragmaArgument() <RPAREN>]
-}
-
-void PragmaArgument ():
-{}
-{
-        <TRUE>
-    |   <FALSE>
-    |   <DECIMAL_LITERAL> 
-    |   <OCTAL_LITERAL>
-    |   <HEX_LITERAL>
-    |   <FLOATING_POINT_LITERAL> 
-    |   <STRING_LITERAL> 
-}
-
-/////////////////////////////////////////////////////
-// Definitions 
-/////////////////////////////////////////////////////
-
-/////////////////////////////////////////////////////
-// Export Definition 
-/////////////////////////////////////////////////////
-void ExportDefinition ():
-{}
-{
-        <EXPORT> ExportBindingList ()
-}
-
-void ExportBindingList ():
-{}
-{
-        ExportBinding() (<COMMA> ExportBinding())*
-}
-
-void ExportBinding ():
-{}
-{
-        LOOKAHEAD(2) FunctionName ()
-    |                FunctionName () <ASSIGN> FunctionName ()
-}
-
-/////////////////////////////////////////////////////
-// Variable Definition (in, NoIN)
-/////////////////////////////////////////////////////
-void VariableDefinition ():
-{}
-{
-        VariableDefinitionKind() VariableBindingList()
-}
-
-void VariableDefinitionNoIN ():
-{}
-{
-        VariableDefinitionKind() VariableBindingListNoIN()
-}
-
-
-void VariableDefinitionKind ():
-{}
-{
-        <VAR>
-    |   <CONST>
-}
-
-void VariableBindingList ():
-{}
-{
-   VariableBinding() (<COMMA> VariableBinding ())*
-}
-
-void VariableBindingListNoIN ():
-{}
-{
-   VariableBindingNoIN() (<COMMA> VariableBindingNoIN())*
-}
-
-void VariableBinding ():
-{}
-{
-        TypedIdentifier() [VariableInitialisation()]
-}
-
-void VariableBindingNoIN ():
-{}
-{
-        TypedIdentifierNoIN() [VariableInitialisationNoIN()]
-}
-
-
-void VariableInitialisation ():
-{}
-{
-       <ASSIGN>  VariableInitializer ()
-}
-
-void VariableInitialisationNoIN ():
-{}
-{
-       <ASSIGN>  VariableInitializerNoIN ()
-}
-
-void VariableInitializer ():
-{}
-{
-        LOOKAHEAD(3) AssignmentExpression ()
-    |                Attributes ()
-}
-
-void VariableInitializerNoIN ():
-{}
-{
-        LOOKAHEAD(3) AssignmentExpressionNoIN ()
-    |                Attributes ()
-}
-
-
-void TypedIdentifier ():
-{}
-{
-        Identifier () [<COLON> TypeExpression()]
-}
-
-void TypedIdentifierNoIN ():
-{}
-{
-        Identifier () [<COLON> TypeExpressionNoIN()]
-}
-
-/////////////////////////////////////////////////////
-// Simple Variable Definition 
-/////////////////////////////////////////////////////
-void SimpleVariableDefinition ():
-{}
-{
-        <VAR> UntypedVariableBindingList()
-}
-
-void UntypedVariableBindingList ():
-{}
-{
-        UntypedVariableBinding() (<COMMA> UntypedVariableBinding())*
-}
-
-void UntypedVariableBinding ():
-{}
-{
-        Identifier() VariableInitialisation()
-}
-
-/////////////////////////////////////////////////////
-// Function Definition
-/////////////////////////////////////////////////////
-void FunctionDefinition ():
-{}
-{
-        <FUNCTION> FunctionName() FunctionCommon()
-}
-
-void FunctionName ():
-{}
-{
-        // no line break after get
-        LOOKAHEAD(2) <GET> Identifier()
-        // no line break after get
-    |   LOOKAHEAD(2) <SET> Identifier()
-    |                 Identifier()
-}
-
-void FunctionCommon ():
-{}
-{
-        <LPAREN> [Parameters()] <RPAREN> [Result()] Block()
-}
-
-void Parameters ():
-{}
-{
-        RestParameters()
-    |   ParameterInit() (<COMMA> ParameterInit())* [RestParameters()]
-}
-
-void Parameter ():
-{}
-{
-        [<CONST>] TypedIdentifier()
-}
-
-void ParameterInit ():
-{}
-{
-        Parameter() [<ASSIGN> AssignmentExpression()]
-}
-
-void RestParameters ():
-{}
-{
-        <ELIPSE> [<CONST> Identifier()]
-}
-
-void Result ():
-{}
-{
-        <COLON> TypeExpression()
-}
-
-/////////////////////////////////////////////////////
-// Class Definition
-/////////////////////////////////////////////////////
-void ClassDefinition ():
-{}
-{
-        <CLASS> Identifier() [Inheritance()] Block()
-}
-
-void InterfaceDefinition ():
-{}
-{
-        LOOKAHEAD(3) <INTERFACE> Identifier() Sc()
-    |                <INTERFACE> Identifier() 
-                                 [<EXTENDS> TypeExpressionList()] Block()
-}
-
-
-void Inheritance ():
-{}
-{ 
-        <EXTENDS> TypeExpression() [<IMPLEMENTS> TypeExpressionList()]
-    |   <IMPLEMENTS> TypeExpressionList()
-}
-
-/////////////////////////////////////////////////////
-// Namespace Definition 
-/////////////////////////////////////////////////////
-void NamespaceDefinition ():
-{}
-{
-        <NAMESPACE> Identifier()
-}
-
-/////////////////////////////////////////////////////
-// Package Definition 
-/////////////////////////////////////////////////////
-void PackageDefinition ():
-{}
-{
-        <PACKAGE> [PackageName()] Block()
-}
-
-void PackageName ():
-{}
-{
-        <STRING_LITERAL>
-    |   PackageIdentifiers()
-}
-
-void PackageIdentifiers ():
-{}
-{
-        Identifier() (<DOT> Identifier())*
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascriptcompiler/DepthFirstTraversal.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascriptcompiler/DepthFirstTraversal.java
deleted file mode 100644
index fc4a433..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascriptcompiler/DepthFirstTraversal.java
+++ /dev/null
@@ -1,1214 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascriptcompiler;
-
-import java.io.PrintStream;
-
-import java.util.HashMap;
-
-import java.util.StringTokenizer;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser.*;
-
-public class DepthFirstTraversal implements JSParser20Visitor
-{
-  protected PrintStream out;
-  private boolean _debug;
-  private int depth;
-  private HashMap<String, String> nameTable;
-
-  public DepthFirstTraversal()
-  {
-    out = System.out;
-    _debug = true;
-    depth = 0;
-  }
-
-
-  public DepthFirstTraversal(PrintStream o)
-  {
-    out = o;
-    _debug = true;
-    depth = 0;
-  }
-
-  public DepthFirstTraversal(PrintStream o, HashMap<String, String> tMap)
-  {
-    out = o;
-    _debug = true;
-    depth = 0;
-    nameTable = tMap;
-  }
-
-
-  public Object depthFirstTraversal(SimpleNode node, Object data)
-  {
-    depth++;
-
-    Token t1 = node.getFirstToken();
-    Token t = new Token();
-    t.next = t1;
-
-    SimpleNode n;
-
-    for (int ord = 0; ord < node.jjtGetNumChildren(); ord++)
-    {
-      //
-      //  Get the next chid node in sequence.
-      //
-      n = (SimpleNode) node.jjtGetChild(ord);
-
-      //
-      // Loop through all the Tokens that are attached to this node.
-      //
-      if (_debug == true)
-      {
-        while (true)
-        {
-          t = t.next;
-
-          if (t == n.getFirstToken()) break;
-
-          print(t);
-        }
-      }
-
-      //
-      // Depth Fist search so visit this nodes children before siblings
-      //
-      n.jjtAccept(this, data);
-
-      t = n.getLastToken();
-    }
-
-    if (_debug == true)
-    {
-      while (t != node.getLastToken())
-      {
-        if (t.next == null) {
-            break;
-        }
-        t = t.next;
-        print(t);
-      }
-    }
-
-    depth--;
-
-    return data;
-  }
-
-  protected void printNode(SimpleNode node)
-  {
-    Token t = node.getFirstToken();
-
-    while (t != node.getLastToken())
-    {
-      print(t);
-      t = t.next;
-    }
-
-    print(node.getLastToken());
-  }
-
-  protected void print(Token t)
-  {
-    //
-    //  Hack Alert: Due to an error with the leaf node ASTEolWithComments
-    //  Wich only matches special and no regular tokens thus we get the next
-    //  valid leafs token stuck in here. Thus we get duplicate info in each file.
-    //  Fixed this with simple flag to recognizes if the token has already been 
-    //  written out.Need to refactor that terminal.
-    //
-    if (t.hasPrinted == true) return;
-    
-    Token tt = t.specialToken;
-
-    if (tt != null)
-    {
-      while (tt.specialToken != null)
-        tt = tt.specialToken;
-
-      while (tt != null)
-      {
-        out.print(addUnicodeEscapes(tt.image));
-        tt = tt.next;
-      }
-    }
-    //
-    //  Check to see if the Token is an identifier kind.
-    //
-    if (t.kind == 78) 
-    {
-      //
-      //  Potential item to swap out.
-      //
-      String temp = nameTable.get(t.image);
-      if (temp != null) 
-      {
-        t.image = temp;
-      }
-    } else if (t.kind == 70 || t.kind == 72 || t.kind == 77) 
-    {
-      //
-      //   Got string that could have a potential class in it (like Eval or 
-      //   RegExp so need to scan the string.
-      //
-      StringTokenizer st;
-      if (t.image.charAt(0) == '"' && t.image.length() > 2) 
-      {
-        st = new StringTokenizer(t.image.substring(1, (t.image.length()-1)));
-                                                  
-      } else 
-      {
-        st = new StringTokenizer(t.image);
-      }
-      StringBuilder replacementString = new StringBuilder(t.image);
-      boolean update = false;
-      while (st.hasMoreTokens()) {
-          String temp1 = st.nextToken();
-          String temp = nameTable.get(temp1);
-          if (temp != null) 
-          {
-            int start = replacementString.indexOf(temp1);
-            int end = start + temp1.length();
-            update = true;
-            replacementString.delete(start, end);
-            replacementString.insert(start, temp);
-          } 
-      }
-      if (update == true) 
-      {
-          System.out.println("Old String is:" + t.image);
-          t.image = replacementString.toString();
-          System.out.println("New String is:" + t.image);
-      }
-    }
-    out.print(addUnicodeEscapes(t.image));
-    t.hasPrinted = true;
-  }
-
-  private String addUnicodeEscapes(String str)
-  {
-    String retval = "";
-    char ch;
-
-    for (int i = 0; i < str.length(); i++)
-    {
-      ch = str.charAt(i);
-
-      if (((ch < 0x20) || (ch > 0x7e)) && (ch != '\t') && (ch != '\n') &&
-          (ch != '\r') && (ch != '\f'))
-      {
-        String s = "0000" + Integer.toString(ch, 16);
-        retval += ("\\u" + s.substring(s.length() - 4, s.length()));
-      }
-      else
-      {
-        retval += ch;
-      }
-    }
-
-    return retval;
-  }
-
-  private String buildPaddedString(String s)
-  {
-    StringBuffer sb = new StringBuffer();
-
-    for (int count = 0; count <= depth; count++)
-    {
-      sb = sb.append(" ");
-    }
-
-    sb = sb.append(s);
-
-    return sb.toString();
-  }
-
-  public Object visit(SimpleNode node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTProgram node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTIdentifier node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTSimpleQualifiedIdentifier node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTExpressionQualifiedIdentifier node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTQualifiedIdentifier node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTPrimaryExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTReservedNamespace node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTFunctionExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTObjectLiteral node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTFieldList node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTLiteralField node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
- }
-
-  public Object visit(ASTFieldName node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTArrayLiteral node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTElementList node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTLiteralElement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTSuperExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTPostfixExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTAttributeExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTFullPostfixExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTFullNewExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTFunctionConstructor node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTFullNewSubexpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTPostfixOp node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTPropertyOrArguments node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTPropertyOperator node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTArguments node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTUnaryExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTMulOp node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTMultiplicativeExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTAddOp node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTAdditiveExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTShiftOp node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTShiftExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTRelOp node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTRelationalExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTRelationalExpressionNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTEqualOp node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTEqualityExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTEqualityExpressionNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTBitwiseANDOp node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTBitwiseANDExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTBitwiseANDExpressionNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTBitwiseXOROp node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTBitwiseXORExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTBitwiseXORExpressionNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTBitwiseOROp node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTBitwiseORExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTBitwiseORExpressionNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTLogicalANDExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTLogicalANDExpressionNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTLogicalORExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTLogicalORExpressionNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTConditionalExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTConditionalExpressionNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTNonAssignmentExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTNonAssignmentExpressionNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTAssignementOperator node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTAssignmentExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTAssignmentExpressionNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTListExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTListExpressionNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTTypeExpression node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTTypeExpressionNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-
-  }
-
-  public Object visit(ASTTypeExpressionList node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-
-  }
-
-  public Object visit(ASTStatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-
-  }
-
-  public Object visit(ASTSubstatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTSubstatements node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTSc node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTEolCommentSkipWs node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTEmptyStatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTExpressionStatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTSuperStatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTBlock node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTLabeledStatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTIfStatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTSwitchStatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTCaseElements node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTCaseElement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTCaseLabel node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTDoStatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTWhileStatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTForStatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTForInitializer node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTForInBinding node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTWithStatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTContinueStatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTBreakStatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTReturnStatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTThrowStatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTTryStatement node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTDirectives node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTDirective node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTAnnotatableDirective node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTAttributes node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTAttribute node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTUseDirective node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTImportDirective node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTIncludeDirective node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTPragma node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTPragmaItems node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTPragmaItem node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTPragmaExpr node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTPragmaArgument node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTExportDefinition node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTExportBindingList node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTExportBinding node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTVariableDefinition node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTVariableDefinitionNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTVariableDefinitionKind node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTVariableBindingList node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTVariableBindingListNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTVariableBinding node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTVariableBindingNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTVariableInitialisation node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTVariableInitialisationNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTVariableInitializer node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTVariableInitializerNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTTypedIdentifier node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTTypedIdentifierNoIN node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTSimpleVariableDefinition node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTUntypedVariableBindingList node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTUntypedVariableBinding node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTFunctionDefinition node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTFunctionName node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTFunctionCommon node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTParameters node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTParameter node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTParameterInit node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTRestParameters node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTResult node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTClassDefinition node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTInterfaceDefinition node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTInheritance node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTNamespaceDefinition node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTPackageDefinition node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTPackageName node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-
-  public Object visit(ASTPackageIdentifiers node, Object data)
-  {
-    depthFirstTraversal(node, data);
-
-    return data;
-  }
-}
-
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascriptcompiler/JavascriptCompiler.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascriptcompiler/JavascriptCompiler.java
deleted file mode 100644
index 7a146b6..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascriptcompiler/JavascriptCompiler.java
+++ /dev/null
@@ -1,111 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascriptcompiler;
-
-import java.io.BufferedOutputStream;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser.JSParser20;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser.ParseException;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser.Token;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.uixtools.FileProcessor;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStreamReader;
-import java.io.InputStream;
-import java.io.PrintStream;
-
-import java.util.HashMap;
-
-public class JavascriptCompiler extends FileProcessor
-{
-  private JSParser20        _jsParser;
-  public  HashMap<String, String>         fileTable;
-
-  public JavascriptCompiler()
-  {
-    super("js", false);
-    fileTable = new HashMap<String,String>();
-  }
-
-  private void init(InputStream in)
-  {
-    // apply overrides
-  }
-
-  protected void processFile(File in, File out)
-    throws Exception
-  {
-    String className, newClassName;
-    FileInputStream inStream = new FileInputStream(in);
-    //
-    //  Get the name of the file
-    //
-    className = in.getName();
-    className = className.substring(0, className.indexOf('.'));
-    //
-    //  Check to see if the name exists as we do not want to over write the four
-    //  special names we are using.
-    //
-    newClassName = fileTable.get(className);
-    if ( newClassName == null) 
-    {
-//       newClassName = "Adf" + className;
-//      fileTable.put(className, newClassName);
-      newClassName = className;
-    }
-    out = new File(out.getParentFile(), newClassName + ".js");
-    PrintStream outStream = new PrintStream(new BufferedOutputStream(new FileOutputStream(out)));
-    process(inStream, outStream);
-    inStream.close();
-    outStream.flush();
-    outStream.close();
-  }
-  private void initParser(InputStream in)
-  {
-
-    if (_jsParser == null)
-    {
-      _jsParser = new JSParser20(in);
-    }
-    else
-    {
-      _jsParser.ReInit(new InputStreamReader(in));
-    }
-  }
-  public void process(InputStream in, PrintStream o) throws ParseException
-  {
-    Token token = null;
-    DepthFirstTraversal vstr;
-    init(in);
-    token = tokenize(in);
-    //
-    //   Create an instance of DepthFirstTraversal
-    //
-    vstr = new DepthFirstTraversal(o, fileTable); 
-    _jsParser.getRootNode().jjtAccept(vstr, null);
-  }
-  private Token tokenize(InputStream in) throws ParseException
-  {
-    initParser(in);
-    return (Token) _jsParser.Program();
-  }
-
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascriptcompiler/JavascriptCompilerMain.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascriptcompiler/JavascriptCompilerMain.java
deleted file mode 100644
index b45c0cd..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/javascriptcompiler/JavascriptCompilerMain.java
+++ /dev/null
@@ -1,123 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.javascriptcompiler;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.javascriptcompiler.JavascriptCompiler;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.ObjectOutputStream;
-import java.io.ObjectInputStream;
-
-import java.util.HashMap;
-
-
-public class JavascriptCompilerMain
-{
-  private JavascriptCompiler _javascriptCompiler;
-
-  public JavascriptCompilerMain()
-  {
-  }
-
-  public static void main(String[] args)
-  {
-    JavascriptCompilerMain _main = new JavascriptCompilerMain();
-    _main._javascriptCompiler = new JavascriptCompiler();
-    try
-    {
-      FileInputStream fis = new FileInputStream("D:\\Foo\\data1.txt");
-      ObjectInputStream ois = new ObjectInputStream(fis);
-      _main._javascriptCompiler.fileTable =  (HashMap<String, String>)ois.readObject(); // Read the object back in here
-      //
-      // 
-      _main._javascriptCompiler.fileTable.put("RichObject", "AdfObject");
-      _main._javascriptCompiler.fileTable.put("RichPage", "AdfPage");
-      _main._javascriptCompiler.fileTable.put("RichConverter", "AdfConverter");
-      _main._javascriptCompiler.fileTable.put("RichValidator", "AdfValidator");
-      _main._javascriptCompiler.fileTable.put("Bootstrap", "AdfBootstrap");
-      _main._javascriptCompiler.fileTable.put("BootstrapFaces", "AdfBootstrapFaces");
-      _main._javascriptCompiler.fileTable.put("XMLRequest", "AdfXMLRequest");
-      _main._javascriptCompiler.fileTable.put("MarshalingService", "AdfMarshalingService");
-      _main._javascriptCompiler.fileTable.put("MessagingService", "AdfMessagingService");
-      ois.close();
-      fis.close();
-    }
-    catch (FileNotFoundException e)
-    {
-      // TODO
-    }
-    catch (IOException e)
-    {
-      // TODO
-    }
-    catch (ClassNotFoundException e) 
-    {
-      // TODO
-    }
-    File in = 
-      new File("D:\\jdevrt\\adf-faces\\trunk\\adf-richclient-demo\\src\\main\\webapp\\jsLibs");
-    File out = new File("D:\\Foo\\Demo\\jsLibs");
-    _main._javascriptCompiler.process(in, out);
-    in = 
-      new File("D:\\jdevrt\\adf-faces\\trunk\\adf-richclient-demo-crm\\src\\main\\webapp\\jsLibs");
-    out = new File("D:\\Foo\\crm\\jsLibs");
-    _main._javascriptCompiler.process(in, out);
-
-    //
-    //  Transform the Api JavaScript files
-    //
-//    File in = 
-//      new File("D:\\jdevrt\\adf-faces\\trunk\\adf-richclient-api\\src\\main\\javascript\\oracle\\adf\\view");
-//    File out = new File("D:\\Foo\\api");
-//    _main._javascriptCompiler.process(in, out);
-    //
-    //  Transform the Impl JavaScript files
-    //
-//    in = 
-//       new File("D:\\jdevrt\\adf-faces\\trunk\\adf-richclient-impl\\src\\main\\javascript\\oracle\\adfinternal\\view\\");
-//    out = new File("D:\\Foo\\impl");
-//    _main._javascriptCompiler.process(in, out);
-    //
-    //  Uodate the serialized version of the HashMap
-    //
-    FileOutputStream fos;
-    ObjectOutputStream oos;
-    try
-    {
-
-      fos = new FileOutputStream("D:\\Foo\\data1.txt");
-      oos = new ObjectOutputStream(fos);
-      oos.writeObject(_main._javascriptCompiler.fileTable);
-      oos.flush();
-      oos.close();
-    }
-    catch (FileNotFoundException e)
-    {
-      // TODO
-    }
-    catch (IOException e)
-    {
-      // TODO
-    }
-  }
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/InputSource.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/InputSource.java
deleted file mode 100644
index 1834dc5..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/InputSource.java
+++ /dev/null
@@ -1,74 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator;
-
-import java.io.InputStream;
-
-
-public class InputSource
-{
-  private boolean _skipObfuscation;
-  private boolean _skipStripComments;
-  private boolean _skipStripWhitespaces;
-  private boolean _skipStripNewlines;
-  private boolean _skipStripSpecialKeywords;
-  private InputStream _in;
-
-  public InputSource(InputStream in, boolean skipObfuscation,
-    boolean skipStripComments, boolean skipStripWhitespaces,
-    boolean skipStripNewlines, boolean skipStripSpecialKeywords)
-  {
-    _in = in;
-    _skipObfuscation = skipObfuscation;
-    _skipStripComments = skipStripComments;
-    _skipStripWhitespaces = skipStripWhitespaces;
-    _skipStripNewlines = skipStripNewlines;
-    _skipStripSpecialKeywords = skipStripSpecialKeywords;
-  }
-
-  public InputStream getInputStream()
-  {
-    return _in;
-  }
-
-  public boolean skipObfuscation()
-  {
-    return _skipObfuscation;
-  }
-
-  public boolean skipStripComments()
-  {
-    return _skipStripComments;
-  }
-
-  public boolean skipStripWhitespaces()
-  {
-    return _skipStripWhitespaces;
-  }
-
-  public boolean skipStripNewlines()
-  {
-    return _skipStripNewlines;
-  }
-
-  public boolean skipStripSpecialKeywords()
-  {
-    return _skipStripSpecialKeywords;
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/Obfuscator.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/Obfuscator.java
deleted file mode 100644
index 7b33f59..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/Obfuscator.java
+++ /dev/null
@@ -1,197 +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.
- */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator;
-
-//~--- non-JDK imports --------------------------------------------------------
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.configuration.ConfigException;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.configuration.ObfuscatorConfig;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.ObfuscatorFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.compression.CompressionFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.keywords.SpecialKeywordsFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.obfuscation.ObfuscationFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.output.OutputGenerator;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.AnnotatedToken;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.JSParser15;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.ParseException;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.uixtools.FileProcessor;
-
-//~--- JDK imports ------------------------------------------------------------
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import java.util.Iterator;
-import java.util.Vector;
-
-import org.apache.commons.io.FileUtils;
-
-//~--- classes ----------------------------------------------------------------
-
-public class Obfuscator
-  extends FileProcessor
-{
-  private Vector _filters = new Vector();
-
-  private ObfuscatorFilter _keywordsFilter = new SpecialKeywordsFilter();
-
-  private ObfuscationFilter _obfuscationFilter = new ObfuscationFilter();
-
-  private OutputGenerator _outputGenerator = new OutputGenerator();
-
-  private ObfuscatorConfig _config;
-
-  private JSParser15 _jsParser;
-
-  private boolean _obfuscate;
-
-  private boolean _replaceCharLiterals;
-
-  private boolean _stripComments;
-
-  private boolean _stripNewlines;
-
-  private boolean _stripSpecialKeywords;
-
-  private boolean _stripWhitespaces;
-
-  //~--- constructors -------------------------------------------------------
-
-  public Obfuscator(boolean obfuscate, boolean stripComments,
-                    boolean stripWhitespaces, boolean stripNewlines,
-                    boolean stripSpecialKeywords,
-                    boolean replaceCharLiterals, ObfuscatorConfig config)
-    throws ConfigException
-  {
-    super("js", false);
-    _obfuscate = obfuscate;
-    _stripComments = stripComments;
-    _stripWhitespaces = stripWhitespaces;
-    _stripNewlines = stripNewlines;
-    _stripSpecialKeywords = stripSpecialKeywords;
-    _replaceCharLiterals = replaceCharLiterals;
-    _config = config;
-  }
-
-  //~--- methods ------------------------------------------------------------
-
-  private void init(InputSource in)
-  {
-
-    // apply overrides
-    boolean obfuscate = in.skipObfuscation()? false: _obfuscate;
-    boolean stripComments = in.skipStripComments()? false: _stripComments;
-    boolean stripWhitespaces =
-      in.skipStripWhitespaces()? false: _stripWhitespaces;
-    boolean stripNewLines = in.skipStripNewlines()? false: _stripNewlines;
-    boolean stripSpecialKeywords =
-      in.skipStripSpecialKeywords()? false: _stripSpecialKeywords;
-
-    // setup filters
-    _filters.clear();
-
-    if (stripSpecialKeywords)
-    {
-      _filters.add(_keywordsFilter);
-    }
-
-    if (stripWhitespaces || stripNewLines || stripComments)
-    {
-      _filters
-      .add(new CompressionFilter(stripComments, stripWhitespaces, stripNewLines));
-    }
-
-    if (obfuscate)
-    {
-      _filters.add(_obfuscationFilter);
-    }
-
-    // make output generator the last filter
-    _filters.add(_outputGenerator);
-  }
-
-  private void initParser(InputStream in)
-  {
-    if (_jsParser == null)
-    {
-      _jsParser = new JSParser15(in);
-    }
-    else
-    {
-      _jsParser.ReInit(in);
-    }
-  }
-
-  public void process(InputSource in, OutputStream out)
-    throws ParseException
-  {
-    init(in);
-    _outputGenerator.setOutputStream(out);
-
-    AnnotatedToken token = tokenize(in.getInputStream());
-
-    for (Iterator itr = _filters.iterator(); itr.hasNext(); )
-    {
-      ObfuscatorFilter filter = (ObfuscatorFilter) itr.next();
-
-      token = filter.filter(token);
-    }
-  }
-
-  protected void processFile(File in, File out)
-    throws Exception
-  {
-    if (_obfuscate == true)
-    {
-      FileInputStream inStream = new FileInputStream(in);
-      FileOutputStream outStream = new FileOutputStream(out);
-      String fileName = in.getName();
-      InputSource inpSource =
-        new InputSource(inStream,
-                          _config.skipObfuscation(fileName),
-                          _config.skipStripComments(fileName),
-                          _config.skipStripWhitespaces(fileName),
-                          _config.skipStripNewlines(fileName),
-                          _config.skipStripSpecialKeywords(fileName));
-
-      process(inpSource, outStream);
-      inStream.close();
-      outStream.close();
-    }
-    else
-    {
-      // Just copy the files over.
-      FileUtils.touch(out);
-      FileUtils.copyFile(in,out);
-    }
-  }
-
-  private AnnotatedToken tokenize(InputStream in)
-    throws ParseException
-  {
-    initParser(in);
-
-    return (AnnotatedToken) _jsParser.Program();
-  }
-}
-
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/configuration/ConfigException.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/configuration/ConfigException.java
deleted file mode 100644
index 91f9731..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/configuration/ConfigException.java
+++ /dev/null
@@ -1,36 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.configuration;
-
-public class ConfigException extends Exception
-{
-  public ConfigException()
-  {
-  }
-
-  public ConfigException(Throwable t)
-  {
-    super(t);
-  }
-
-  public ConfigException(String msg)
-  {
-    super(msg);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/configuration/ObfuscatorConfig.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/configuration/ObfuscatorConfig.java
deleted file mode 100644
index 0e7282e..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/configuration/ObfuscatorConfig.java
+++ /dev/null
@@ -1,63 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.configuration;
-
-import java.util.Vector;
-
-public class ObfuscatorConfig
-{
-  private Vector _obfExclusions = new Vector();
-  private Vector _commentsExclusions = new Vector();
-  private Vector _wsExclusions = new Vector();
-  private Vector _nlExclusions = new Vector();
-  private Vector _keywordExclusions = new Vector();
-
-  public ObfuscatorConfig() throws ConfigException
-  {
-  }
-
-  public boolean skipObfuscation(String file)
-  {
-    return _obfExclusions.contains(file);
-  }
-
-  public boolean skipStripComments(String file)
-  {
-    return _commentsExclusions.contains(file);
-  }
-
-  public boolean skipStripWhitespaces(String file)
-  {
-    return _wsExclusions.contains(file);
-  }
-
-  public boolean skipStripNewlines(String file)
-  {
-    return _nlExclusions.contains(file);
-  }
-
-  public boolean skipStripSpecialKeywords(String file)
-  {
-    return _keywordExclusions.contains(file);
-  }
-
-  private void init() throws ConfigException
-  {
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/configuration/config.xml b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/configuration/config.xml
deleted file mode 100644
index 4c1f66b..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/configuration/config.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="windows-1252" ?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-	   
--->
-<obfuscator>
-  <input>
-    <exclusions>
-      <obfuscation>
-      </obfuscation>
-      <comments>
-      </comments>
-      <whitespaces>
-      </whitespaces>
-      <newlines>
-      </newlines>
-      <specialkeywords>
-        <file>Assert.js</file>
-        <file>Logger.js</file>      
-      </specialkeywords>
-    </exclusions>
-  </input>
-</obfuscator>
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/ObfuscatorFilter.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/ObfuscatorFilter.java
deleted file mode 100644
index ad27402..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/ObfuscatorFilter.java
+++ /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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.AnnotatedToken;
-
-
-public interface ObfuscatorFilter
-{
-  AnnotatedToken filter(AnnotatedToken startToken);
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/compression/CommentsHandler.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/compression/CommentsHandler.java
deleted file mode 100644
index 5f21318..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/compression/CommentsHandler.java
+++ /dev/null
@@ -1,50 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.compression;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.AnnotatedToken;
-
-
-public class CommentsHandler implements CompressionHandler
-{
-  public CommentsHandler()
-  {
-  }
-
-  public void handle(AnnotatedToken token, AnnotatedToken prevToken)
-  {
-    AnnotatedToken specialToken = token.getSpecialToken();
-    AnnotatedToken prevSpecialToken = token;
-
-    while (specialToken != null)
-    {
-      // remove single line and multiline comments
-      if (specialToken.isComment())
-      {
-        prevSpecialToken.specialToken = specialToken.specialToken;
-        specialToken = specialToken.getSpecialToken();
-      }
-      else
-      {
-        prevSpecialToken = specialToken;
-        specialToken = specialToken.getSpecialToken();
-      }
-    }
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/compression/CompressionFilter.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/compression/CompressionFilter.java
deleted file mode 100644
index a375a4b..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/compression/CompressionFilter.java
+++ /dev/null
@@ -1,85 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.compression;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.ObfuscatorFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.AnnotatedToken;
-
-import java.util.Iterator;
-import java.util.Vector;
-
-
-public class CompressionFilter implements ObfuscatorFilter
-{
-  private boolean _stripComments;
-  private boolean _stripWhitespaces;
-  private boolean _stripNewlines;
-  private Vector _handlers = new Vector();
-
-  public CompressionFilter(boolean stripComments, boolean stripWhitespaces,
-    boolean stripNewlines)
-  {
-    _stripComments = stripComments;
-    _stripWhitespaces = stripWhitespaces;
-    _stripNewlines = stripNewlines;
-
-    // create a set of handlers based on supplied options
-    init();
-  }
-
-  public AnnotatedToken filter(AnnotatedToken startToken)
-  {
-    AnnotatedToken token = startToken;
-    AnnotatedToken prevToken = null;
-
-    while (token != null)
-    {
-      // hand off to handlers
-      // todo: inline these if this is too expensive
-      for (Iterator itr = _handlers.iterator(); itr.hasNext();)
-      {
-        CompressionHandler handler = (CompressionHandler) itr.next();
-        handler.handle(token, prevToken);
-      }
-
-      prevToken = token;
-      token = token.getNext();
-    }
-
-    return startToken;
-  }
-
-  private void init()
-  {
-    if (_stripComments)
-    {
-      _handlers.add(new CommentsHandler());
-    }
-
-    if (_stripWhitespaces)
-    {
-      _handlers.add(new WhitespaceHandler());
-    }
-
-    if (_stripNewlines)
-    {
-      _handlers.add(new NewlineHandler());
-    }
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/compression/CompressionHandler.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/compression/CompressionHandler.java
deleted file mode 100644
index 320ba36..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/compression/CompressionHandler.java
+++ /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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.compression;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.AnnotatedToken;
-
-
-public interface CompressionHandler
-{
-  void handle(AnnotatedToken token, AnnotatedToken prevToken);
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/compression/NewlineHandler.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/compression/NewlineHandler.java
deleted file mode 100644
index 9022bf7..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/compression/NewlineHandler.java
+++ /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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.compression;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.AnnotatedToken;
-
-
-public class NewlineHandler implements CompressionHandler
-{
-  public NewlineHandler()
-  {
-  }
-
-  public void handle(AnnotatedToken token, AnnotatedToken prevToken)
-  {
-    AnnotatedToken specialToken = token.getSpecialToken();
-    AnnotatedToken prevSpecialToken = token;
-    boolean skipOne = (prevToken == null) ? false : true;
-
-    while (specialToken != null)
-    {
-      if (specialToken.isNewLine())
-      {
-        if (skipOne)
-        {
-          skipOne = false;
-          specialToken.image = "\r\n";
-          prevSpecialToken = specialToken;
-          specialToken = specialToken.getSpecialToken();
-        }
-        else
-        {
-          prevSpecialToken.specialToken = specialToken.specialToken;
-          specialToken = specialToken.getSpecialToken();
-        }
-      }
-      else
-      {
-        prevSpecialToken = specialToken;
-        specialToken = specialToken.getSpecialToken();
-      }
-    }
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/compression/WhitespaceHandler.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/compression/WhitespaceHandler.java
deleted file mode 100644
index 6c6b838..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/compression/WhitespaceHandler.java
+++ /dev/null
@@ -1,63 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.compression;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.AnnotatedToken;
-
-
-public class WhitespaceHandler implements CompressionHandler
-{
-  public WhitespaceHandler()
-  {
-  }
-
-  public void handle(AnnotatedToken token, AnnotatedToken prevToken)
-  {
-    AnnotatedToken specialToken = token.getSpecialToken();
-    AnnotatedToken prevSpecialToken = token;
-    boolean skipOne = (prevToken == null) ? false
-                                          : (prevToken.isWSSensitive() ||
-      token.isInfixWSSensitive());
-
-    while (specialToken != null)
-    {
-      // remove whitespace. Keep one if the token is whitespace sensitive
-      if (specialToken.isWhiteSpace())
-      {
-        if (skipOne)
-        {
-          skipOne = false;
-          specialToken.image = " ";
-          prevSpecialToken = specialToken;
-          specialToken = specialToken.getSpecialToken();
-        }
-        else
-        {
-          prevSpecialToken.specialToken = specialToken.specialToken;
-          specialToken = specialToken.getSpecialToken();
-        }
-      }
-      else
-      {
-        prevSpecialToken = specialToken;
-        specialToken = specialToken.getSpecialToken();
-      }
-    }
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/keywords/SpecialKeywordsFilter.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/keywords/SpecialKeywordsFilter.java
deleted file mode 100644
index 419c050..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/keywords/SpecialKeywordsFilter.java
+++ /dev/null
@@ -1,100 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.keywords;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.ObfuscatorFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.AnnotatedToken;
-
-
-public class SpecialKeywordsFilter implements ObfuscatorFilter
-{
-  public SpecialKeywordsFilter()
-  {
-  }
-
-  public AnnotatedToken filter(AnnotatedToken startToken)
-  {
-    AnnotatedToken token = startToken;
-    token = removeSpecialTypes(token);
-
-    return token;
-  }
-
-  protected void removeSpecialTokens(AnnotatedToken token)
-  {
-    AnnotatedToken specialToken = token.getSpecialToken();
-    AnnotatedToken prevSpecialToken = token;
-
-    while (specialToken != null)
-    {
-      if (specialToken.isRemovableKeyword())
-      {
-        prevSpecialToken.specialToken = specialToken.specialToken;
-        specialToken = specialToken.getSpecialToken();
-      }
-      else
-      {
-        prevSpecialToken = specialToken;
-        specialToken = specialToken.getSpecialToken();
-      }
-    }
-  }
-
-  /**
-   * The main loop removes special types (like Profiler, and CheckPoint) and
-   * all method invocations using variables of these types. The main
-   * loop calls removeSpecialTokens which removes special keywords like Assert
-   * and Logger, which were tagged by the parser as SpecialTokens
-   * @param startToken
-   * @return
-   */
-  protected AnnotatedToken removeSpecialTypes(AnnotatedToken startToken)
-  {
-    AnnotatedToken token = startToken;
-    AnnotatedToken prevToken = null;
-    AnnotatedToken newStartToken = null;
-
-    while (token != null)
-    {
-      if (token.canRemove())
-      {
-        if (prevToken != null)
-        {
-          prevToken.next = token.getNext();
-        }
-
-        token = token.getNext();
-      }
-      else
-      {
-        removeSpecialTokens(token);
-
-        if (newStartToken == null)
-        {
-          newStartToken = token;
-        }
-
-        prevToken = token;
-        token = token.getNext();
-      }
-    }
-
-    return newStartToken;
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/ObfuscationFilter.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/ObfuscationFilter.java
deleted file mode 100644
index 2590731..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/ObfuscationFilter.java
+++ /dev/null
@@ -1,44 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.obfuscation;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.ObfuscatorFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.obfuscation.state.RootState;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.AnnotatedToken;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.ProgramContextStack;
-
-
-public class ObfuscationFilter implements ObfuscatorFilter
-{
-  public ObfuscationFilter()
-  {
-  }
-
-  public AnnotatedToken filter(AnnotatedToken startToken)
-  {
-    if (startToken != null)
-    {
-      // transition to root state
-      ProgramContextStack programContextStack = new ProgramContextStack();
-      RootState.getInstance().enterState(programContextStack, startToken, null);
-    }
-
-    return startToken;
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/state/FunctionContext.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/state/FunctionContext.java
deleted file mode 100644
index 819a1c4..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/state/FunctionContext.java
+++ /dev/null
@@ -1,45 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.obfuscation.state;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.NameGen;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.ProgramContext;
-
-
-public class FunctionContext extends ProgramContext {
-    private boolean _obfuscateLocalVars;
-
-    public FunctionContext(String name, boolean obfuscateLocalVars) {
-        super(name);
-        _obfuscateLocalVars = obfuscateLocalVars;
-    }
-
-    public FunctionContext(String name, NameGen nameGen, boolean usesEval) {
-        super(name, nameGen);
-        _obfuscateLocalVars = usesEval;
-    }
-
-    public void setObfuscateLocalVars(boolean obfuscateLocalVars) {
-        _obfuscateLocalVars = obfuscateLocalVars;
-    }
-
-    public boolean canObfuscateLocalVars() {
-        return _obfuscateLocalVars;
-    }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/state/FunctionState.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/state/FunctionState.java
deleted file mode 100644
index 1989582..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/state/FunctionState.java
+++ /dev/null
@@ -1,123 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.obfuscation.state;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.AnnotatedToken;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.AnnotationConstants;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.JSParser15Constants;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.NameGen;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.ProgramContext;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.ProgramContextStack;
-
-import java.util.Iterator;
-import java.util.Vector;
-
-
-public class FunctionState extends ObfuscationState
-{
-  static private FunctionState _instance;
-
-  // private construnctor for singleton
-  private FunctionState()
-  {
-  }
-
-  static public FunctionState getInstance()
-  {
-    if (_instance == null)
-    {
-      synchronized (FunctionState.class)
-      {
-        if (_instance == null)
-        {
-          _instance = new FunctionState();
-        }
-      }
-    }
-
-    return _instance;
-  }
-
-  public AnnotatedToken enterState(ProgramContextStack contextStack,
-    AnnotatedToken startToken, NameGen nameGen)
-  {
-    FunctionContext functionContext;
-    AnnotatedToken token = startToken;
-    String contextName = "AnonymousFunction";
-    Vector params = (Vector) token.getAnnotationObject();
-    boolean obfuscateLocalVars = !token.functionUsesEval();
-
-    if (token.getKind() == AnnotationConstants.NAMED_FUNCTION)
-    {
-      // grab the function name
-      token = token.getNext();
-      contextName = token.image;
-      functionContext = new FunctionContext(contextName, obfuscateLocalVars);
-    }
-    else
-    {
-      // reuse the symbol name generator for anonymous functions
-      functionContext = new FunctionContext(contextName, nameGen,
-          obfuscateLocalVars);
-    }
-
-    if (obfuscateLocalVars)
-    {
-      obfuscateFunctionParams(params, functionContext);
-    }
-
-    while (token.kind != JSParser15Constants.LBRACE)
-    {
-      token = token.getNext();
-    }
-
-    token = token.getNext();
-    contextStack.pushContext(functionContext);
-
-    return processCodeBlock(contextStack, token);
-  }
-
-  private void obfuscateFunctionParams(Vector params,
-    ProgramContext functionContext)
-  {
-    for (Iterator itr = params.iterator(); itr.hasNext();)
-    {
-      AnnotatedToken paramToken = (AnnotatedToken) itr.next();
-      functionContext.addToken(paramToken.image, paramToken);
-      paramToken.image = functionContext.generateSymbolName();
-    }
-  }
-
-  public void exitState(ProgramContextStack contextStack)
-  {
-    contextStack.popContext();
-  }
-
-  protected void processVarIdentifier(ProgramContextStack contextStack,
-    AnnotatedToken token)
-  {
-    FunctionContext functionContext = (FunctionContext) contextStack.peek();
-
-    // normal processing for functions that do not use eval() calls
-    if (functionContext.canObfuscateLocalVars())
-    {
-      super.processVarIdentifier(contextStack, token);
-    }
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/state/ObfuscationState.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/state/ObfuscationState.java
deleted file mode 100644
index 10e16c9..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/state/ObfuscationState.java
+++ /dev/null
@@ -1,127 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.obfuscation.state;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.AnnotatedToken;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.AnnotationConstants;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.JSParser15Constants;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.NameGen;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.ProgramContext;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.ProgramContextStack;
-
-
-public abstract class ObfuscationState
-{
-  public abstract AnnotatedToken enterState(ProgramContextStack contextStack,
-    AnnotatedToken startToken, NameGen nameGen);
-
-  public abstract void exitState(ProgramContextStack contextStack);
-
-  /**
-  * Obfuscates variable declarations
-  * @param contextStack
-  * @param token
-  */
-  protected void processVarIdentifier(ProgramContextStack contextStack,
-    AnnotatedToken token)
-  {
-    ProgramContext blockContext = (ProgramContext) contextStack.peek();
-
-    // skip global vars
-    if (contextStack.size() > 1)
-    {
-      // add only if we have not seen this variable before in this context.
-      AnnotatedToken savedToken = blockContext.getToken(token.image);
-      String tokenImage;
-
-      if (savedToken == null)
-      {
-        tokenImage = blockContext.generateSymbolName();
-        blockContext.addToken(token.image, token);
-      }
-      else
-      {
-        tokenImage = savedToken.image;
-      }
-
-      token.image = tokenImage;
-    }
-  }
-
-  /**
-  *
-  * @param contextStack
-  * @param startToken
-  * @return
-  */
-  public AnnotatedToken processCodeBlock(ProgramContextStack contextStack,
-    AnnotatedToken startToken)
-  {
-    // grab the context on top of the stack
-    ProgramContext blockContext = (ProgramContext) contextStack.peek();
-    AnnotatedToken token = startToken;
-
-    while (token != null)
-    {
-      switch (token.getKind())
-      {
-      case AnnotationConstants.NAMED_FUNCTION:
-      case AnnotationConstants.ANONYMOUS_FUNCTION:
-        token = FunctionState.getInstance().enterState(contextStack, token,
-            blockContext.getNameGen());
-
-        break;
-
-      case AnnotationConstants.VAR_IDENTIFIER:
-      {
-        processVarIdentifier(contextStack, token);
-
-        break;
-      }
-
-      case JSParser15Constants.IDENTIFIER:
-      case AnnotationConstants.OBJECT_IDENTIFIER:
-
-        AnnotatedToken obfuscatedToken = contextStack.getToken(token.image);
-
-        if (obfuscatedToken != null)
-        {
-          token.image = obfuscatedToken.image;
-        }
-
-        break;
-
-      case JSParser15Constants.LBRACE:
-        token = StatementBlockState.getInstance().enterState(contextStack,
-            token, blockContext.getNameGen());
-
-        break;
-
-      case JSParser15Constants.RBRACE:
-        exitState(contextStack);
-
-        return token;
-      }
-
-      token = token.getNext();
-    }
-
-    return token;
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/state/RootState.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/state/RootState.java
deleted file mode 100644
index 6f082c6..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/state/RootState.java
+++ /dev/null
@@ -1,64 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.obfuscation.state;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.AnnotatedToken;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.NameGen;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.ProgramContext;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.ProgramContextStack;
-
-
-public class RootState extends ObfuscationState
-{
-  static private RootState _instance;
-
-  // private construnctor for singleton
-  private RootState()
-  {
-  }
-
-  static public RootState getInstance()
-  {
-    if (_instance == null)
-    {
-      synchronized (RootState.class)
-      {
-        if (_instance == null)
-        {
-          _instance = new RootState();
-        }
-      }
-    }
-
-    return _instance;
-  }
-
-  public AnnotatedToken enterState(ProgramContextStack contextStack,
-    AnnotatedToken startToken, NameGen nameGen)
-  {
-    contextStack.pushContext(new ProgramContext("root"));
-
-    return processCodeBlock(contextStack, startToken);
-  }
-
-  public void exitState(ProgramContextStack contextStack)
-  {
-    contextStack.popContext();
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/state/StatementBlockState.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/state/StatementBlockState.java
deleted file mode 100644
index 9e67bff..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/obfuscation/state/StatementBlockState.java
+++ /dev/null
@@ -1,79 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.obfuscation.state;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.AnnotatedToken;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.NameGen;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.ProgramContext;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.ProgramContextStack;
-
-
-public class StatementBlockState extends ObfuscationState
-{
-  static private StatementBlockState _instance;
-
-  private StatementBlockState()
-  {
-  }
-
-  static public StatementBlockState getInstance()
-  {
-    if (_instance == null)
-    {
-      synchronized (StatementBlockState.class)
-      {
-        if (_instance == null)
-        {
-          _instance = new StatementBlockState();
-        }
-      }
-    }
-
-    return _instance;
-  }
-
-  public AnnotatedToken enterState(ProgramContextStack contextStack,
-    AnnotatedToken startToken, NameGen nameGen)
-  {
-    // do not create a new context in a statement block. JavaScript does not use a new scope in a
-    // statement block
-    AnnotatedToken token = startToken.getNext();
-
-    return processCodeBlock(contextStack, token);
-  }
-
-  public void exitState(ProgramContextStack contextStack)
-  {
-    // do not pop context
-  }
-
-  protected void processVarIdentifier(ProgramContextStack contextStack,
-    AnnotatedToken token)
-  {
-    ProgramContext blockContext = (ProgramContext) contextStack.peek();
-
-    // normal processing for functions that do not use eval() calls
-    if (!(blockContext instanceof FunctionContext) ||
-        (blockContext instanceof FunctionContext &&
-        ((FunctionContext) blockContext).canObfuscateLocalVars()))
-    {
-      super.processVarIdentifier(contextStack, token);
-    }
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/output/OutputGenerator.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/output/OutputGenerator.java
deleted file mode 100644
index 5f9268a..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/filters/output/OutputGenerator.java
+++ /dev/null
@@ -1,78 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.output;
-
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.filters.ObfuscatorFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.AnnotatedToken;
-import org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser.Token;
-
-import java.io.BufferedOutputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-
-
-public class OutputGenerator implements ObfuscatorFilter
-{
-  private PrintStream _outStream;
-
-  public OutputGenerator()
-  {
-  }
-
-  public OutputGenerator(OutputStream outStream)
-  {
-    _outStream = new PrintStream(new BufferedOutputStream(outStream));
-  }
-
-  public AnnotatedToken filter(AnnotatedToken startToken)
-  {
-    AnnotatedToken token = startToken;
-
-    while (token != null)
-    {
-      printToken(token);
-      token = token.getNext();
-    }
-
-    _outStream.flush();
-
-    return startToken;
-  }
-
-  public void setOutputStream(OutputStream outStream)
-  {
-    _outStream = new PrintStream(new BufferedOutputStream(outStream));
-  }
-
-  public PrintStream getOutputStream()
-  {
-    return _outStream;
-  }
-
-  private void printToken(Token token)
-  {
-    // print special tokens first
-    if (token.specialToken != null)
-    {
-      printToken(token.specialToken);
-    }
-
-    _outStream.print(token.image);
-  }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/AnnotatedToken.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/AnnotatedToken.java
deleted file mode 100644
index 1234326..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/AnnotatedToken.java
+++ /dev/null
@@ -1,181 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser;
-
-import java.util.Vector;
-
-public class AnnotatedToken extends Token {
-    protected static final Vector SPECIAL_TYPES = new Vector();
-
-    static {
-        SPECIAL_TYPES.add("Profiler");
-        SPECIAL_TYPES.add("Checkpoint");
-        SPECIAL_TYPES.add("Assert");
-        SPECIAL_TYPES.add("Logger");
-    }
-    
-    public static final int PREFIX_WS = 1;
-    public static final int INFIX_WS = 2;
-
-    protected int _annotationKind = AnnotationConstants.UNDEFINED;
-    protected Object _annotationObject;
-    protected int _wsSensitive = 0;
-    protected boolean _remove;
-    protected boolean _funcUsesEval;
-    protected String _type = "undefined";
-    protected Vector _productions = new Vector();
-
-    public AnnotatedToken() {
-    }
-
-    public AnnotatedToken(int annotationKind, Object annotationObject) {
-        super();
-        _annotationKind = annotationKind;
-        _annotationObject = annotationObject;
-    }
-
-    public void setAnnotationKind(int annotationKind) {
-        _annotationKind = annotationKind;
-    }
-
-    public int getAnnotationKind() {
-        return _annotationKind;
-    }
-
-    public int getKind() {
-        if (_annotationKind != AnnotationConstants.UNDEFINED) {
-            return _annotationKind;
-        }
-
-        return kind;
-    }
-
-    public void setAnnotationObject(Object annotationObject) {
-        _annotationObject = annotationObject;
-    }
-
-    public Object getAnnotationObject() {
-        return _annotationObject;
-    }
-
-    public AnnotatedToken getNext() {
-        return (AnnotatedToken)next;
-    }
-
-    public AnnotatedToken getSpecialToken() {
-        return (AnnotatedToken)specialToken;
-    }
-
-    public boolean isWhiteSpace() {
-        return (kind == JSParser15Constants.WS);
-    }
-
-    public boolean isNewLine() {
-        return (kind == JSParser15Constants.EOL);
-    }
-
-    public boolean isComment() {
-        return ((kind == JSParser15Constants.SINGLE_LINE_COMMENT) ||
-                (kind == JSParser15Constants.MULTI_LINE_COMMENT));
-    }
-
-    public boolean isWSSensitive() {
-        return _wsSensitive != 0;
-    }
-
-    public void setWSSensitive(int i) {
-        _wsSensitive = i;
-    }
-
-    public boolean isPrefixWSSensitive() {
-        return _wsSensitive == PREFIX_WS;
-    }
-
-    public boolean isInfixWSSensitive() {
-        return _wsSensitive == INFIX_WS;
-    }
-
-    public boolean isRemovableKeyword() {
-        boolean isRemovable = false;
-
-        switch (kind) {
-        default :
-            break;
-
-            //      case JSParser14Constants.ASSERT_STATEMENT:
-            //      case JSParser14Constants.LOGGER_STATEMENT:
-            //        isRemovable = true;
-            //        break;
-        }
-
-        return isRemovable;
-    }
-
-    public boolean isSpecialClassType() {
-        return SPECIAL_TYPES.contains(image);
-    }
-
-    public boolean isSpecialObjectType() {
-        return SPECIAL_TYPES.contains(_type);
-    }
-
-    /**
-   * @return Returns the _remove.
-   */
-    public boolean canRemove() {
-        return _remove;
-    }
-
-    /**
-   * @param _remove The _remove to set.
-   */
-    public void setRemovable(boolean remove) {
-        this._remove = remove;
-    }
-
-    /**
-   * @return Returns the _type.
-   */
-    public String getType() {
-        return _type;
-    }
-
-    /**
-   * @param _type The _type to set.
-   */
-    public void setType(String type) {
-        this._type = type;
-    }
-
-    public void setFunctionUsesEval(boolean usesEval) {
-        _funcUsesEval = usesEval;
-    }
-
-    public boolean functionUsesEval() {
-        return _funcUsesEval;
-    }
-
-    //    public void addProduction(SimpleNode node) {
-    //        _productions.add(node);
-    //    }
-
-    public Vector getProductions() {
-        return _productions;
-    }
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/AnnotationConstants.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/AnnotationConstants.java
deleted file mode 100644
index 286b52d..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/AnnotationConstants.java
+++ /dev/null
@@ -1,32 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser;
-
-public interface AnnotationConstants {
-    int UNDEFINED = -999;
-    int VAR_IDENTIFIER = -1;
-    int FUNCTION_NAME_IDENTIFIER = -2;
-    int FUNCTION_PARAM_IDENTIFIER = -3;
-    int LITERAL_OBJECT_KEY_IDENTIFIER = -4;
-    int OBJECT_IDENTIFIER = -5;
-    int OBJECT_FIELD_IDENTIFIER = -6;
-    int OBJECT_METHOD_IDENTIFIER = -7;
-    int NAMED_FUNCTION = -8;
-    int ANONYMOUS_FUNCTION = -9;
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/JSParserTest15.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/JSParserTest15.java
deleted file mode 100644
index 5c7c1d3..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/JSParserTest15.java
+++ /dev/null
@@ -1,104 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-
-
-public class JSParserTest15
-{
-  protected InputStream _in;
-
-  public JSParserTest15(InputStream in)
-  {
-    _in = in;
-  }
-
-  public void start()
-  {
-    // create an instance of the parser
-    JSParser15 jsParser = new JSParser15(_in);
-
-    Token t;
-
-    try
-    {
-      for (t = jsParser.Program(); t != null; t = t.next)
-      {
-        System.out
-        .println(t.kind + "\t" + JSParser15.tokenImage[t.kind] + "\t" +
-                           t.image + "\t" +
-                           ((AnnotatedToken) t).getAnnotationKind() +
-                           "\t" + ((AnnotatedToken) t).canRemove());
-        printSpecialTokens((AnnotatedToken) t);
-      }
-
-      // jsParser.getRootNode().dump("p");
-    }
-    catch (Throwable e)
-    {
-      e.printStackTrace();
-    }
-  }
-
-  public void printSpecialTokens(AnnotatedToken token)
-  {
-    AnnotatedToken specialToken = token.getSpecialToken();
-
-    while (specialToken != null)
-    {
-      System.out.println(specialToken.image);
-      specialToken = specialToken.getSpecialToken();
-    }
-  }
-
-  public static void main(String[] args)
-  {
-    if (args.length == 0)
-    {
-      System.out.println("Usage: JSParserTest15 <JS File>");
-
-      return;
-    }
-
-    File jsFile = new File(args[0]);
-    FileInputStream inFileStream;
-
-    try
-    {
-      inFileStream = new FileInputStream(jsFile);
-
-      JSParserTest15 jsParserTest = new JSParserTest15(inFileStream);
-      jsParserTest.start();
-      inFileStream.close();
-    }
-    catch (FileNotFoundException e)
-    {
-      System.out.println("FileNotFound");
-    }
-    catch (IOException e)
-    {
-      System.out.println("FileIO");
-    }
-  }
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/JSParserUtils.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/JSParserUtils.java
deleted file mode 100644
index 2b6e375..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/JSParserUtils.java
+++ /dev/null
@@ -1,381 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser;
-
-import java.util.Enumeration;
-import java.util.Vector;
-
-
-public class JSParserUtils
-{
-  public JSParserUtils()
-  {
-  }
-
-  /**
-   *
-   * @param funcToken
-   * @param bodyStart
-   * @param bodyEnd
-   */
-  public static void tagEvalCalls(Token funcToken, Token bodyStart,
-                                  Token bodyEnd)
-  {
-    boolean hasEval = false;
-    Token token = bodyStart;
-
-    while (token != bodyEnd)
-    {
-      if ((token.kind == JSParser15Constants.IDENTIFIER) &&
-          token.image.equals("eval") && (token.next != null) &&
-          (token.next.kind == JSParser15Constants.LPAREN))
-      {
-        hasEval = true;
-
-        break;
-      }
-
-      token = token.next;
-    }
-
-    ((AnnotatedToken) funcToken).setFunctionUsesEval(hasEval);
-  }
-
-  /**
-   *
-   * @param contextStack
-   * @param token
-   */
-  public static void pushToken(ProgramContextStack contextStack,
-                               AnnotatedToken token)
-  {
-    ProgramContext context = (ProgramContext) contextStack.peek();
-    context.addToken(token.image, token);
-  }
-
-  /**
-   *
-   * @param contextStack
-   * @param v
-   */
-  public static void pushTokens(ProgramContextStack contextStack, Vector v)
-  {
-    for (Enumeration item = v.elements(); item.hasMoreElements(); )
-    {
-      AnnotatedToken t = (AnnotatedToken) item.nextElement();
-      pushToken(contextStack, t);
-    }
-  }
-
-  /**
-   *
-   * @param objToken
-   * @param end
-   */
-  public static void tagObjectIdentifier(Token objToken, Token end)
-  {
-    Token t = objToken.next;
-    Token suffixToken = null;
-
-    while (t != end)
-    {
-      if (t.kind == JSParser15Constants.DOT)
-      {
-        annotateToken(objToken, AnnotationConstants.OBJECT_IDENTIFIER,
-                      null, -1);
-        suffixToken = t.next;
-
-        if ((suffixToken != null) &&
-            (suffixToken.kind == JSParser15Constants.IDENTIFIER))
-        {
-          annotateToken(suffixToken,
-                        AnnotationConstants.OBJECT_FIELD_IDENTIFIER, null,
-                        -1);
-        }
-      }
-
-      if ((t.kind == JSParser15Constants.LPAREN) && (suffixToken != null))
-      {
-        annotateToken(suffixToken,
-                      AnnotationConstants.OBJECT_METHOD_IDENTIFIER, null,
-                      -1);
-      }
-
-      t = t.next;
-    }
-  }
-
-  /**
-   *
-   * @param contextStack
-   * @param start
-   * @param end
-   */
-  public static void tagMethodInvocation(ProgramContextStack contextStack,
-                                         AnnotatedToken start,
-                                         AnnotatedToken end)
-  {
-    if (tagAssertProfilerCalls(contextStack, start, end))
-    {
-      return;
-    }
-
-    tagLoggerCalls(contextStack, start, end);
-  }
-
-  /**
-   *
-   * @param contextStack
-   * @param start
-   * @param end
-   * @return
-   */
-  private static boolean tagAssertProfilerCalls(ProgramContextStack contextStack,
-                                                AnnotatedToken start,
-                                                AnnotatedToken end)
-  {
-    AnnotatedToken token = start;
-    boolean isSpecialType = false;
-    boolean isRemovable = false;
-
-    while (token != end)
-    {
-      // This checks for:
-      // "Profiler.xxx=...;"
-      // or "foo.<profiler method>;" where foo is a var of type Profiler
-      AnnotatedToken objToken = contextStack.getToken(token.image);
-
-      if ((token.isSpecialClassType() ||
-           ((objToken != null) && objToken.isSpecialObjectType())) &&
-          (token.getKind() == AnnotationConstants.OBJECT_IDENTIFIER))
-      {
-        isSpecialType = true;
-      }
-
-      if (isSpecialType &&
-          (token.getKind() == AnnotationConstants.OBJECT_METHOD_IDENTIFIER))
-      {
-        isRemovable = true;
-
-        break;
-      }
-
-      token = token.getNext();
-    }
-
-    if (isRemovable)
-    {
-      token = start;
-
-      while (token != end)
-      {
-        token.setRemovable(true);
-        token = token.getNext();
-      }
-
-      if (token.kind == JSParser15Constants.SEMICOLON)
-      {
-        token.setRemovable(true);
-      }
-    }
-
-    return isRemovable;
-  }
-
-  /**
-   *
-   * @param contextStack
-   * @param start
-   * @param end
-   * @return
-   */
-  private static boolean tagLoggerCalls(ProgramContextStack contextStack,
-                                        AnnotatedToken start,
-                                        AnnotatedToken end)
-  {
-    AnnotatedToken token = start;
-    boolean isSpecialType = false;
-    boolean isLOGGER = false;
-    boolean isRemovable = false;
-
-    while (token != end)
-    {
-      // This checks for:
-      // "Logger.LOGGER.<static method>"
-      if ((token.isSpecialClassType()) &&
-          (token.getKind() == AnnotationConstants.OBJECT_IDENTIFIER))
-      {
-        isSpecialType = true;
-      }
-
-      if (isSpecialType &&
-          (token.getKind() == AnnotationConstants.OBJECT_FIELD_IDENTIFIER) &&
-          token.image.equals("LOGGER"))
-      {
-        isLOGGER = true;
-      }
-
-      if (isLOGGER &&
-          (token.getKind() == AnnotationConstants.OBJECT_METHOD_IDENTIFIER))
-      {
-        isRemovable = true;
-
-        break;
-      }
-
-      token = token.getNext();
-    }
-
-    if (isRemovable)
-    {
-      token = start;
-
-      while (token != end)
-      {
-        token.setRemovable(true);
-        token = token.getNext();
-      }
-
-      if (token.kind == JSParser15Constants.SEMICOLON)
-      {
-        token.setRemovable(true);
-      }
-    }
-
-    return isRemovable;
-  }
-
-  /**
-   *
-   * @param contextStack
-   * @param lhs
-   * @param op
-   * @param rhs
-   * @param end
-   */
-  public static void tagAssignmentExpression(ProgramContextStack contextStack,
-                                             AnnotatedToken varToken,
-                                             AnnotatedToken lhs,
-                                             AnnotatedToken op,
-                                             AnnotatedToken rhs,
-                                             AnnotatedToken end)
-  {
-    AnnotatedToken token = (varToken != null)? varToken: lhs;
-    boolean isSpecialType = false;
-    boolean isRemovable = false;
-    ProgramContext context = (ProgramContext) contextStack.peek();
-
-    if (rhs.kind != JSParser15Constants.IDENTIFIER)
-    {
-      return;
-    }
-
-    while (token != end)
-    {
-      // This checks for:
-      // "var foo = Profiler.xxx=...;"
-      // or "var bar = foo.<profiler method>;"
-      AnnotatedToken objToken = contextStack.getToken(token.image);
-
-      if ((token.isSpecialClassType() ||
-           ((objToken != null) && objToken.isSpecialObjectType())) &&
-          (token.getKind() == AnnotationConstants.OBJECT_IDENTIFIER))
-      {
-        isSpecialType = true;
-      }
-
-      if (isSpecialType &&
-          (token.getKind() == AnnotationConstants.OBJECT_METHOD_IDENTIFIER))
-      {
-        isRemovable = true;
-
-        break;
-      }
-
-      token = token.getNext();
-    }
-
-    if (isRemovable)
-    {
-      token = (varToken != null)? varToken: lhs;
-
-      AnnotatedToken prevToken = lhs;
-
-      while (token != end)
-      {
-        token.setRemovable(true);
-
-        if (token.getNext().isSpecialClassType() &&
-            (token.kind == JSParser15Constants.ASSIGN))
-        {
-          // This saves the LHS var name "foo" to be removed later. It also assigns the LHS type
-          // "var foo = Profiler.xxx=...;"
-          prevToken.setType(token.next.image);
-          context.addToken(prevToken.image, prevToken);
-        }
-
-        prevToken = token;
-        token = token.getNext();
-      }
-    }
-  }
-
-  /**
-   *
-   * @param t
-   * @param annotationId
-   * @param annotationObject
-   * @param wsSensitive
-   */
-  public static void annotateToken(Token t, int annotationId,
-                                   Object annotationObject,
-                                   int wsSensitive)
-  {
-    AnnotatedToken annToken = (AnnotatedToken) t;
-    annToken.setAnnotationKind(annotationId);
-
-    if (annotationObject != null)
-    {
-      annToken.setAnnotationObject(annotationObject);
-    }
-
-    if (wsSensitive >= 0)
-    {
-      annToken.setWSSensitive(wsSensitive);
-    }
-  }
-
-  /**
-   *
-   * @param v
-   * @param annotationId
-   * @param annotationObject
-   * @param wsSensitive
-   */
-  public static void annotateTokens(Vector v, int annotationId,
-                                    Object annotationObject,
-                                    int wsSensitive)
-  {
-    for (Enumeration item = v.elements(); item.hasMoreElements(); )
-    {
-      Token t = (Token) item.nextElement();
-      annotateToken(t, annotationId, annotationObject, wsSensitive);
-    }
-  }
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/NameGen.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/NameGen.java
deleted file mode 100644
index 1d79b0c..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/NameGen.java
+++ /dev/null
@@ -1,33 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser;
-
-public class NameGen
-{
-  private int _nextId = 0;
-
-  public NameGen()
-  {
-  }
-
-  public String getName()
-  {
-    return "x" + _nextId++;
-  }
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/ProgramContext.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/ProgramContext.java
deleted file mode 100644
index a800c8e..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/ProgramContext.java
+++ /dev/null
@@ -1,92 +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.
- */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser;
-
-//~--- JDK imports ------------------------------------------------------------
-
-import java.util.HashMap;
-
-//~--- classes ----------------------------------------------------------------
-
-public class ProgramContext
-{
-
-  // Table of symbol name, AnnotatedToken
-  protected HashMap _symbolTable = new HashMap();
-  protected String _name;
-  protected NameGen _nameGen;
-
-  //~--- constructors -------------------------------------------------------
-
-  public ProgramContext(String name)
-  {
-    this(name, new NameGen());
-  }
-
-  public ProgramContext(String name, NameGen nameGen)
-  {
-    _name = name;
-    _nameGen = nameGen;
-  }
-
-  //~--- methods ------------------------------------------------------------
-
-  public void addToken(String name, AnnotatedToken token)
-  {
-    _symbolTable.put(name, token);
-  }
-
-  public String generateSymbolName()
-  {
-    return _nameGen.getName();
-  }
-
-  //~--- get methods --------------------------------------------------------
-
-  public String getName()
-  {
-    return _name;
-  }
-
-  public NameGen getNameGen()
-  {
-    return _nameGen;
-  }
-
-  public AnnotatedToken getToken(String key)
-  {
-    return (AnnotatedToken) _symbolTable.get(key);
-  }
-
-  //~--- set methods --------------------------------------------------------
-
-  public void setName(String name)
-  {
-    _name = name;
-  }
-
-  public void setNameGen(NameGen nameGen)
-  {
-    _nameGen = nameGen;
-  }
-}
-
-
-//~ Formatted by Jindent --- http://www.jindent.com
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/ProgramContextStack.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/ProgramContextStack.java
deleted file mode 100644
index b6fe821..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/ProgramContextStack.java
+++ /dev/null
@@ -1,84 +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.
- */
-
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser;
-
-//~--- JDK imports ------------------------------------------------------------
-
-import java.util.Stack;
-
-//~--- classes ----------------------------------------------------------------
-
-public class ProgramContextStack extends Stack {
-    public ProgramContextStack() {}
-
-    //~--- methods ------------------------------------------------------------
-
-    public ProgramContext popContext() {
-        return ((ProgramContext) pop());
-    }
-
-    public void pushContext(ProgramContext context) {
-        push(context);
-    }
-
-    //~--- get methods --------------------------------------------------------
-
-    public AnnotatedToken getToken(String name) {
-        AnnotatedToken token = null;
-
-        for (int i = size() - 1; i >= 0; i--) {
-            ProgramContext context = (ProgramContext) get(i);
-
-            if (null != (token = context.getToken(name))) {
-                break;
-            }
-        }
-
-        return token;
-    }
-
-    /**
-     *
-     * @param name
-     * @param depth
-     * @return
-     */
-    public AnnotatedToken getToken(String name, int depth) {
-        int end;
-
-        end = size() - depth;
-        end = Math.max(end, 0);
-
-        AnnotatedToken token = null;
-
-        for (int i = size() - 1; i >= end; i--) {
-            ProgramContext context = (ProgramContext) get(i);
-
-            if (null != (token = context.getToken(name))) {
-                break;
-            }
-        }
-
-        return token;
-    }
-}
-
-
-//~ Formatted by Jindent --- http://www.jindent.com
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/Token.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/Token.java
deleted file mode 100644
index 81d2945..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/Token.java
+++ /dev/null
@@ -1,99 +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.
- */
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser;
-
-/**
- * Describes the input token stream.
- */
-
-public class Token {
-
-  /**
-   * An integer that describes the kind of this token.  This numbering
-   * system is determined by JavaCCParser, and a table of these numbers is
-   * stored in the file ...Constants.java.
-   */
-  public int kind;
-
-  /**
-   * beginLine and beginColumn describe the position of the first character
-   * of this token; endLine and endColumn describe the position of the
-   * last character of this token.
-   */
-  public int beginLine, beginColumn, endLine, endColumn;
-
-  /**
-   * The string image of the token.
-   */
-  public String image;
-
-  /**
-   * A reference to the next regular (non-special) token from the input
-   * stream.  If this is the last token from the input stream, or if the
-   * token manager has not read tokens beyond this one, this field is
-   * set to null.  This is true only if this token is also a regular
-   * token.  Otherwise, see below for a description of the contents of
-   * this field.
-   */
-  public Token next;
-
-  /**
-   * This field is used to access special tokens that occur prior to this
-   * token, but after the immediately preceding regular (non-special) token.
-   * If there are no such special tokens, this field is set to null.
-   * When there are more than one such special token, this field refers
-   * to the last of these special tokens, which in turn refers to the next
-   * previous special token through its specialToken field, and so on
-   * until the first special token (whose specialToken field is null).
-   * The next fields of special tokens refer to other special tokens that
-   * immediately follow it (without an intervening regular token).  If there
-   * is no such token, this field is null.
-   */
-  public Token specialToken;
-
-  /**
-   * Returns the image.
-   */
-  public String toString()
-  {
-     return image;
-  }
-
-  /**
-   * Returns a new Token object, by default. However, if you want, you
-   * can create and return subclass objects based on the value of ofKind.
-   * Simply add the cases to the switch for all those special cases.
-   * For example, if you have a subclass of Token called IDToken that
-   * you want to create if ofKind is ID, simlpy add something like :
-   *
-   *    case MyParserConstants.ID : return new IDToken();
-   *
-   * to the following switch statement. Then you can cast matchedToken
-   * variable to the appropriate type and use it in your lexical actions.
-   */
-  public static final Token newToken(int ofKind)
-  {
-     switch(ofKind)
-     {
-       default : return new AnnotatedToken();
-     }
-  }
-
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/js1.5.jj b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/js1.5.jj
deleted file mode 100644
index df7fc90..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/obfuscator/javascript15parser/js1.5.jj
+++ /dev/null
@@ -1,1183 +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.
- */
-options {
-  STATIC=false;
-  DEBUG_TOKEN_MANAGER=false;
-  DEBUG_PARSER=false;
-}
-
-PARSER_BEGIN(JSParser15)
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.obfuscator.javascript15parser;
-import java.util.Vector;
-import java.io.IOException;
-public class JSParser15 
-{
-    // This is a stack of symbol tables for the JS file
-    protected ProgramContextStack _contextStack = new ProgramContextStack();
-    
-}
-
-PARSER_END(JSParser15)
-
-/////////////////////////////////////////////////////
-// LEXICAL RULES Section
-/////////////////////////////////////////////////////
-TOKEN_MGR_DECLS :
-{
-    private boolean isRegValid = true;
-    public void setRegInvalid()
-    {
-        isRegValid = false;
-    }
-    public void setRegValid()
-    {
-        isRegValid = true;
-    }
-}
-
-/////////////////////////////////////////////////////
-// WHITE SPACE 
-/////////////////////////////////////////////////////
-SPECIAL_TOKEN :
-{
-        <EOL:   (["\n","\r"])+ >
-    |   <WS:    ([" ","\t"])+ >
-}
-/////////////////////////////////////////////////////
-// COMMENTS 
-/////////////////////////////////////////////////////
-MORE :
-{
-        "//" : IN_SINGLE_LINE_COMMENT
-    |   "/*" : IN_MULTI_LINE_COMMENT
-}
-
-<IN_SINGLE_LINE_COMMENT>
-SPECIAL_TOKEN :
-{
-        < SINGLE_LINE_COMMENT: (~["\n","\r"])* ("\n"|"\r"|"\r\n")? >  : DEFAULT
-}
-
-<IN_MULTI_LINE_COMMENT>
-SPECIAL_TOKEN :
-{
-        <MULTI_LINE_COMMENT: "*/" > : DEFAULT
-}
-
-<IN_SINGLE_LINE_COMMENT, IN_MULTI_LINE_COMMENT>
-MORE :
-{
-        < ~[] >
-}
-/////////////////////////////////////////////////////
-// RESERVED WORDS AND LITERALS
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < BREAK:        "break" >
-    |   < CONTINUE:     "continue" >
-    |   < DELETE:       "delete" >
-    |   < ELSE:         "else" >
-    |   < FOR:          "for" >
-    |   < FUNCTION:     "function" >
-    |   < FUNCTION_:    "Function" >
-    |   < IF:           "if" >
-    |   < IN:           "in" >
-    |   < NEW:          "new" >
-    |   < RETURN:       "return" >
-    |   < THIS:         "this" >
-    |   < TYPEOF:       "typeof" >
-    |   < INSTANCEOF:   "instanceof" >
-    |   < VAR:          "var" >
-    |   < VOID:         "void" >
-    |   < WHILE:        "while" >
-    |   < WITH:         "with" >
-    |   < CASE:         "case" >
-    |   < CATCH:        "catch" >
-    |   < CLASS:        "class" >
-    |   < CONST:        "const" >
-    |   < DEBUGGER:     "debugger" >
-    |   < _DEFAULT:     "default" >
-    |   < DO:           "do" >
-    |   < ENUM:         "enum" >
-    |   < EXPORT:       "export" >
-    |   < EXTENDS:      "extends" >
-    |   < FINALLY:      "finally" >
-    |   < IMPORT:       "import" >
-    |   < SUPER:        "super" >
-    |   < SWITCH:       "switch" >
-    |   < THROW:        "throw" >
-    |   < TRY:          "try" >
-    |   < TRUE:         "true" >    // They are not supposed to be keywords
-    |   < FALSE:        "false" >   // They are not supposed to be keywords
-    |   < NULL:         "null" >    // They are not supposed to be keywords
-}
-/////////////////////////////////////////////////////
-// LITERALS 
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* >
-    |   < HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ >
-    |   < OCTAL_LITERAL: "0" (["0"-"7"])* >
-    |   < FLOATING_POINT_LITERAL: (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? 
-                                |   "." (["0"-"9"])+ (<EXPONENT>)? 
-                                |   (["0"-"9"])+ (<EXPONENT>)? 
-        >
-    |   < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
-    |   < STRING_LITERAL:   "\""  
-                            ( (~["\"","\\","\n","\r"]) | <ESCAPE_SEQUENCE> )* 
-                            "\""
-                        |   "\"" 
-                            ( (~["\"", "\\"]) | "\\" ("\n" | "\r" | "\r\n") | <ESCAPE_SEQUENCE> )* 
-                            "\""  
-                        |   "'"
-                            ( (~["'","\\","\n","\r"]) | <ESCAPE_SEQUENCE> )*
-                            "'"
-        >
-    |   < #ESCAPE_SEQUENCE: 
-            "\\"
-            (       ["n","t","b","r","f","\\","'","\"","[","]"]
-                |   ["0"-"7"] ( ["0"-"7"] )?
-                |   ["0"-"3"] ["0"-"7"] ["0"-"7"]
-                |   ["x"] ["0"-"9","a"-"f","A"-"F"] ["0"-"9","a"-"f","A"-"F"]
-                |   ["u"] ["0"-"9","a"-"f","A"-"F"] ["0"-"9","a"-"f","A"-"F"] 
-                          ["0"-"9","a"-"f","A"-"F"] ["0"-"9","a"-"f","A"-"F"]
-            )
-        >
-    |   < UNTERMINATED_STRING_LITERAL:
-                "\"" ( <ESCAPE_SEQUENCE> | (~["\"","\\","\n","\r"]) )* ( ["\n","\r"] )?
-            |   "'"  ( <ESCAPE_SEQUENCE> | (~["'","\\","\n","\r"])  )* ( ["\n","\r"] )?
-        >
-}
-/////////////////////////////////////////////////////
-// REGULAR EXPRESSIONS 
-/////////////////////////////////////////////////////
-TOKEN :
-{ 
-        < #REGX_START_CHAR : ~["\r","\n","/","=","*"] | "\\/">
-    |   < #REGX_BODY_CHAR_EXCLUSION : ~["\r","\n","/"] >  
-    |   < #REGX_BODY_CHAR : ( <REGX_BODY_CHAR_EXCLUSION> | "\\/" ) >
-    |   < #REGEX_END_CHAR :     "i" 
-                            |   "g" 
-                            |   "m" 
-                            |   "ig" 
-                            |   "im" 
-                            |   "gi" 
-                            |   "gm" 
-                            |   "mi" 
-                            |   "mg" 
-                            |   "igm" 
-                            |   "img" 
-                            |   "gmi" 
-                            |   "gim" 
-                            |   "mig" 
-                            |   "mgi" 
-        >
-}
-
-TOKEN :
-{
-        <REGULAR_EXPRESSION : "/" <REGX_START_CHAR> (<REGX_BODY_CHAR>)* "/" (<REGEX_END_CHAR>)? >
-        {
-           try {
-                // Peek at the next character.
-                char nextCh = input_stream.readChar();
-                input_stream.backup(1);
-                if (isRegValid == false || nextCh == '/' || nextCh == '*') {
-                    //
-                    // Lexecal analyser thinks it is a RE
-                    // operator such as /...../
-                    // Put the everything to the first "/" back on the input stream
-                    //
-                    input_stream.backup(lengthOfMatch-1);
-                    //
-                    // And remove it from the token
-                    //
-                    matchedToken.image = matchedToken.image.substring(0, 1);
-                    image.delete(0, image.length() - 1);
-                    image.append('/');
-                    matchedToken.kind=SLASH;
-                }
-               } catch (IOException e) {
-                    throw new Error(e.toString());
-               }
-        }        
-
-}
-/////////////////////////////////////////////////////
-// IDENTIFIERS 
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
-    |   < #LETTER: ["a"-"z","A"-"Z","$","_"] >
-    |   < #DIGIT: ["0"-"9"]>
-}
-/////////////////////////////////////////////////////
-// SEPARATORS 
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < LPAREN:   "(" >
-    |   < RPAREN:   ")" >
-    |   < LBRACE:   "{" >
-    |   < RBRACE:   "}" >
-    |   < LBRACKET: "[" >
-    |   < RBRACKET: "]" >
-    |   < SEMICOLON: ";" >
-    |   < COMMA:    "," >
-    |   < DOT:      "." >
-}
-
-/////////////////////////////////////////////////////
-// OPERATORS 
-/////////////////////////////////////////////////////
-TOKEN :
-{
-        < ASSIGN:               "=" >
-    |   < GT:                   ">" >
-    |   < LT:                   "<" >
-    |   < BANG:                 "!" >
-    |   < TILDE:                "~" >
-    |   < HOOK:                 "?" >
-    |   < COLON:                ":" >
-    |   < EQ:                   "==" >
-    |   < LE:                   "<=" >
-    |   < GE:                   ">=" >
-    |   < NE:                   "!=" >
-    |   < SC_OR:                "||" >
-    |   < SC_AND:               "&&" >
-    |   < INCR:                 "++" >
-    |   < DECR:                 "--" >
-    |   < PLUS:                 "+" >
-    |   < MINUS:                "-" >
-    |   < STAR:                 "*" >
-    |   < SLASH:                "/" >
-    |   < BIT_AND:              "&" >
-    |   < BIT_OR:               "|" >
-    |   < XOR:                  "^" >
-    |   < REM:                  "%" >
-    |   < LSHIFT:               "<<" >
-    |   < RSIGNEDSHIFT:         ">>" >
-    |   < RUNSIGNEDSHIFT:       ">>>" >
-    |   < PLUSASSIGN:           "+=" >
-    |   < MINUSASSIGN:          "-=" >
-    |   < STARASSIGN:           "*=" >
-    |   < SLASHASSIGN:          "/=" >
-    |   < ANDASSIGN:            "&=" >
-    |   < ORASSIGN:             "|=" >
-    |   < XORASSIGN:            "^=" >
-    |   < REMASSIGN:            "%=" >
-    |   < LSHIFTASSIGN:         "<<=" >
-    |   < RSIGNEDSHIFTASSIGN:   ">>=" >
-    |   < RUNSIGNEDSHIFTASSIGN: ">>>=" >
-    |   < IDENTITYOPER:         "===" >
-    |   < NOTIDENTITYOPER:      "!==" >
-}
-///////////////////////////////////////////////////////////////////
-// GRAMMAR Section
-///////////////////////////////////////////////////////////////////
-
-void Literal():
-{}
-{
-        <DECIMAL_LITERAL> 
-    |   <OCTAL_LITERAL>
-    |   <HEX_LITERAL>
-    |   <FLOATING_POINT_LITERAL> 
-    |   <STRING_LITERAL> 
-    |   <TRUE> 
-    |   <FALSE>
-    |   <REGULAR_EXPRESSION> 
-    |   <NULL>
-}
-
-Token Identifier():
-{
-		Token t;
-}
-{
-    	t = <IDENTIFIER> {return t;}
-}
-
-void PrimaryExpression():
-{
-		Token prefixToken = null;	
-}
-{
-    (
-        prefixToken = <THIS>            (PrimarySuffix())*
-            {
-               JSParserUtils.tagObjectIdentifier(prefixToken, getToken(1));
-            }
-    |   prefixToken=Identifier()        (PrimarySuffix())*
-            {
-               JSParserUtils.tagObjectIdentifier(prefixToken, getToken(1));
-               JSParserUtils.tagMethodInvocation(_contextStack, 
-                                                 (AnnotatedToken)prefixToken, 
-                                                 (AnnotatedToken)getToken(1));
-            }
-    |   LOOKAHEAD(2)  <STRING_LITERAL>      (PrimarySuffix())*  
-    |   LOOKAHEAD(2)  <REGULAR_EXPRESSION>  (PrimarySuffix())*    
-    |   LOOKAHEAD(2)  Literal() 
-    |   FunctionLiteral()
-    |   NestedArrayLiteral()                (PrimarySuffix())*
-    |   ObjectLiteral() 
-    |   <LPAREN> Expression() <RPAREN>      (PrimarySuffix())* 
-    |   AllocationExpression() (PrimarySuffix())*             
-    )
-    {
-        token_source.setRegValid();
-    }
-}
-
-void PrimarySuffix():
-{}
-{
-        Arguments() 
-    |   {token_source.setRegInvalid();} <LBRACKET> Expression() <RBRACKET> 
-    |   {token_source.setRegInvalid();} <DOT> Identifier()
-}
-
-void Arguments():
-{}
-{
-        <LPAREN> {token_source.setRegValid();} [ArgumentList()] <RPAREN>
-}
-
-void ArgumentList():
-{}
-{
-        AssignmentExpression() (<COMMA> AssignmentExpression())*
-}
-
-void LiteralArgumentList():
-{}
-{
-        <STRING_LITERAL> (<COMMA> <STRING_LITERAL>)*
-}
-
-void NewSuffix():
-{}
-{
-        <DOT> Identifier()
-}
-
-void AllocationExpression():
-{
-        Token t;
-}
-{
-        LOOKAHEAD(4)  t=<NEW> <THIS>       (LOOKAHEAD(2) NewSuffix())* [LOOKAHEAD(2) Arguments()] 
-            {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.PREFIX_WS);}
-    |   LOOKAHEAD(4)  t=<NEW> Identifier() (LOOKAHEAD(2) NewSuffix())* [LOOKAHEAD(2) Arguments()] 
-            {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.PREFIX_WS);}
-    |   LOOKAHEAD(4)  t=<NEW> FunctionConstructor() (LOOKAHEAD(2) NewSuffix())* [LOOKAHEAD (2) Arguments()] 
-            {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.PREFIX_WS);}
-}
-
-
-void PostfixOp():
-{}
-{
-        <INCR>
-    |   <DECR>
-}
-
-void PostfixExpression():
-{}
-{
-        PrimaryExpression() [PostfixOp()]
-}
-
-
-void UnaryOp():
-{
-        Token t;
-}
-{
-        t=<DELETE>
-            {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.INFIX_WS);}
-    |   t=<VOID>
-            {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.INFIX_WS);}
-    |   t=<TYPEOF>
-            {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.INFIX_WS);}
-    |   t=<INCR>
-            {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.INFIX_WS);}
-    |   t=<DECR>
-            {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.INFIX_WS);}    
-    |   t=<PLUS>
-            {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.INFIX_WS);}    
-    |   t=<MINUS>
-            {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.INFIX_WS);}    
-    |   t=<TILDE>
-            {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.INFIX_WS);}    
-    |   t=<BANG>
-            {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.INFIX_WS);}    
-}
-
-void UnaryExpression():
-{}
-{
-        PostfixExpression()
-    |   UnaryOp() UnaryExpression()
-}
-
-void MulOp():
-{}
-{
-        <STAR>
-    |   <SLASH>
-    |   <REM> 
-}
-
-void MultiplicativeExpression():
-{}
-{
-        UnaryExpression() (MulOp() UnaryExpression())*
-} 
-
-void AddOp():
-{}
-{
-        <PLUS> 
-    |   <MINUS>
-}
-
-void AdditiveExpression():
-{}
-{
-        MultiplicativeExpression() (AddOp() MultiplicativeExpression())*
-} 
-
-void ShiftOp():
-{}
-{
-        <LSHIFT>
-    |   <RSIGNEDSHIFT>
-    |   <RUNSIGNEDSHIFT>
-}
-
-void ShiftExpression():
-{}
-{
-        AdditiveExpression() (ShiftOp() AdditiveExpression())*
-}
-
-void RelOp():
-{}
-{
-        <LT>
-    |   <GT> 
-    |   <LE> 
-    |   <GE>
-}
-
-void RelationalExpression():
-{
-        Token t;
-}
-{
-        ShiftExpression() 
-            (LOOKAHEAD(3) (  RelOp() 
-                           | t=<INSTANCEOF> 
-                             {JSParserUtils.annotateToken(t, 
-                                                          AnnotationConstants.UNDEFINED, 
-                                                          null, AnnotatedToken.INFIX_WS);}
-                           | t=<IN> 
-                             {JSParserUtils.annotateToken(t,
-                                                          AnnotationConstants.UNDEFINED,
-                                                          null, AnnotatedToken.INFIX_WS);})
-             ShiftExpression())*
-}
-
-void RelationalExpressionNoIN():
-{
-        Token t;
-}
-{
-        ShiftExpression() 
-            ( (  RelOp() 
-               | t=<INSTANCEOF>  
-                 {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, 
-                                              null, AnnotatedToken.INFIX_WS);})
-              ShiftExpression())*
-}
-
-void EqualOp():
-{}
-{
-        <EQ> 
-    |   <NE> 
-    |   <IDENTITYOPER> 
-    |   <NOTIDENTITYOPER>
-}
-
-void EqualityExpression():
-{}
-{
-        RelationalExpression() (EqualOp() RelationalExpression())*
-}
-
-void EqualityExpressionNoIN():
-{}
-{
-        RelationalExpressionNoIN() (EqualOp() RelationalExpressionNoIN())*
-}
-
-
-void BitwiseANDOp():
-{}
-{
-        <BIT_AND>
-}
-
-void BitwiseANDExpression():
-{}
-{
-        EqualityExpression() (BitwiseANDOp() EqualityExpression())*
-}
-
-void BitwiseANDExpressionNoIN():
-{}
-{
-        EqualityExpressionNoIN() (BitwiseANDOp() EqualityExpressionNoIN())*
-}
-
-
-void BitwiseXOROp():
-{}
-{
-        <XOR>
-}
-
-void BitwiseXORExpression():
-{}
-{
-        BitwiseANDExpression() (BitwiseXOROp() BitwiseANDExpression())*
-}
-
-void BitwiseXORExpressionNoIN():
-{}
-{
-        BitwiseANDExpressionNoIN() (BitwiseXOROp() BitwiseANDExpressionNoIN())*
-}
-
-void BitwiseOROp():
-{}
-{
-        <BIT_OR>
-}
-
-void BitwiseORExpression():
-{}
-{
-        BitwiseXORExpression() (BitwiseOROp() BitwiseXORExpression())*
-}
-
-void BitwiseORExpressionNoIN():
-{}
-{
-        BitwiseXORExpressionNoIN() (BitwiseOROp() BitwiseXORExpressionNoIN())*
-}
-
-void LogicalANDExpression():
-{}
-{
-        BitwiseORExpression() (<SC_AND> BitwiseORExpression())*
-}
-
-void LogicalANDExpressionNoIN():
-{}
-{
-        BitwiseORExpressionNoIN() (<SC_AND> BitwiseORExpressionNoIN())*
-}
-
-void LogicalORExpression():
-{}
-{
-        LogicalANDExpression() (<SC_OR> LogicalANDExpression())*
-}
-
-void LogicalORExpressionNoIN():
-{}
-{
-        LogicalANDExpressionNoIN() (<SC_OR> LogicalANDExpressionNoIN())*
-}
-
-void ConditionalExpression():
-{}
-{
-        LogicalORExpression() [<HOOK> Expression() <COLON> ConditionalExpression()]
-}
-
-void ConditionalExpressionNoIN():
-{}
-{
-        LogicalORExpressionNoIN() [<HOOK> ExpressionNoIN() <COLON> ConditionalExpressionNoIN()]
-}
-
-Token AssignementOperator():
-{
-        Token t;
-}
-{
-        ( t=<ASSIGN>
-    |     t=<STARASSIGN>
-    |     t=<SLASHASSIGN> 
-    |     t=<REMASSIGN> 
-    |     t=<PLUSASSIGN>
-    |     t=<MINUSASSIGN> 
-    |     t=<LSHIFTASSIGN> 
-    |     t=<RSIGNEDSHIFTASSIGN>
-    |     t=<RUNSIGNEDSHIFTASSIGN>
-    |     t=<ANDASSIGN> 
-    |     t=<XORASSIGN> 
-    |     t=<ORASSIGN> )
-        { return t; } 
-}
-
-void AssignmentExpression():
-{
-        Token tLHS      = getToken(1); 
-		Token tOperator = null; 
-		Token tRHS      = null;
-		Token tEnd      = null;
-}
-{
-        ConditionalExpression() 
-            [ (AssignementOperator() 
-               {tRHS=getToken(1);}
-               AssignmentExpression())
-               {
-                  tEnd = getToken(1);
-                  JSParserUtils.tagAssignmentExpression(_contextStack, null, 
-                                                        (AnnotatedToken)tLHS, 
-                                                        (AnnotatedToken)tOperator,
-                                                        (AnnotatedToken)tRHS, 
-                                                        (AnnotatedToken)tEnd); 
-               }
-            ]
-}
-
-void AssignmentExpressionNoIN():
-{
-        Token tLHS      = getToken(1); 
-		Token tOperator = null; 
-		Token tRHS      = null;
-		Token tEnd      = null;
-}
-{
-        ConditionalExpressionNoIN() 
-            [ (AssignementOperator() {tRHS=getToken(1);}
-               AssignmentExpressionNoIN())
-               {
-                  tEnd = getToken(1);
-                  JSParserUtils.tagAssignmentExpression(_contextStack, null, 
-                                                        (AnnotatedToken)tLHS, 
-                                                        (AnnotatedToken)tOperator,
-                                                        (AnnotatedToken)tRHS, 
-                                                        (AnnotatedToken)tEnd); 
-               }
-            ]
-}
-
-
-void Expression()                     :
-{}
-{
-  AssignmentExpression() ( "," AssignmentExpression() )*
-}   
-
-void ExpressionNoIN()                     :
-{}
-{
-  AssignmentExpressionNoIN() ( "," AssignmentExpressionNoIN() )*
-}   
-
-
-void Statement():
-{}
-{
-        LOOKAHEAD(3)    Block(null)
-    |                   VariableStatement()
-    |                   EmptyStatement()
-    |                   ExpressionStatement()
-    |                   IfStatement()
-    |                   IterationStatement()
-    |                   ContinueStatement()
-    |                   BreakStatement()
-    |                   ReturnStatement()
-    |                   WithStatement()
-    |                   TryStatement()
-    |                   ThrowStatement()
-    |                   SwitchStatement()
-}
- 
-void Block(ProgramContext context):
-{}
-{
-        LOOKAHEAD(3)    <LBRACE> <RBRACE>   
-    |                   <LBRACE> {
-                                     if (context == null) {
-                                        _contextStack.pushContext(new ProgramContext("block"));
- 	                                 }
-                                 }
-                                 [StatementList()] 
-                                 <RBRACE>
-                                 {
-                                     _contextStack.popContext();
-                                 }
-}
- 
-void VariableStatement():
-{
-        Token t;
-}
-{
-        t=<VAR> {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.PREFIX_WS);}
-        VariableDeclarationList(t) Sc()
-}
- 
-void VariableDeclarationList(Token varToken):
-{}
-{
-        VariableDeclaration(varToken) ( <COMMA> VariableDeclaration(varToken) )*
-}
-
-void VariableDeclaration(Token varToken):
-{
-        Token lhs      = null;
-        Token[] tArray = null;
-}
-{
-        lhs=Identifier() [Initializer()]
-        {
-            JSParserUtils.annotateToken(lhs, AnnotationConstants.VAR_IDENTIFIER, null, -1);
-            JSParserUtils.pushToken(_contextStack, (AnnotatedToken)lhs);      
-      
-            if(tArray != null) {
-      	       Token end = getToken(1);
-               JSParserUtils.tagAssignmentExpression(_contextStack, (AnnotatedToken)varToken, 
-                                                     (AnnotatedToken)lhs, (AnnotatedToken)tArray[0], 
-                                                     (AnnotatedToken)tArray[1], (AnnotatedToken)end); 
-            }
-        }
-}
-
-Token[] Initializer():
-{
-        Token[] tArray = new Token[2];
-}
-{
-        tArray[0]=<ASSIGN> {tArray[1]=getToken(1);} 
-        AssignmentExpression()
-        {return tArray;}
-}
- 
-void EmptyStatement():
-{}
-{
-        <SEMICOLON>
-}
-
-void ExpressionStatement():
-{}
-{
-        Expression() Sc() 
-}
-
-JAVACODE
-  void Sc() {
-
-    Token tok = getToken(1);
-    if (tok.kind == SEMICOLON) {
-       tok = getNextToken();
-    } else if (tok.specialToken != null) {
-       if (!EolCommentSkipWs(tok.specialToken) && (tok.kind != EOF)) {
-          throw generateParseException();
-       }
-    } else if ((tok.kind != EOF) && (tok.kind!=RBRACE)) {
-         throw generateParseException();
-    }
-  }
- 
-JAVACODE
-  boolean EolCommentSkipWs(Token t) {
-    boolean retVal = false;
-    Token specialToken = t;
-    while(specialToken != null) {
-      if(specialToken.kind == WS) {
-        specialToken = specialToken.specialToken;
-        continue;
-      }
-      else if(specialToken.kind == EOL  || 
-              specialToken.kind == SINGLE_LINE_COMMENT) {
-        retVal = true;
-        break;
-      }
-      else {
-        break;
-      }
-    }
-    return retVal;
-  }
- 
-void IfStatement():
-{
-        Token t;
-}
-{
-        <IF> <LPAREN> Expression() <RPAREN> 
-            Statement() 
-            [ LOOKAHEAD(1) t=<ELSE> {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED,
-                                                                 null, AnnotatedToken.PREFIX_WS);}
-              Statement()
-            ]
-}
-
-
-void IterationStatement():
-{}
-{
-                            WhileStatement()
-    |                       DoStatement()
-    |   LOOKAHEAD(<FOR> <LPAREN> Expression() <SEMICOLON>)                     
-                            ForStatement()
-    |   LOOKAHEAD(<FOR> <LPAREN> <SEMICOLON>)                                  
-                            ForStatement()
-    |   LOOKAHEAD(<FOR> <LPAREN> varToekn=<VAR> VariableDeclarationList(varToken) <SEMICOLON>)  
-                            ForVarStatement()
-    |   LOOKAHEAD(3)        ForInStatement()
-    |   LOOKAHEAD(3)        ForVarInStatement()
-}
- 
-void DoStatement():
-{}
-{
-        <DO> Statement() <WHILE> <LPAREN> Expression() <RPAREN>
-}
-
-void WhileStatement():
-{}
-{
-        <WHILE> <LPAREN> Expression() <RPAREN> 
-            Statement()
-}
- 
-void ForStatement():
-{}
-{
-        <FOR> <LPAREN>  [Expression()] <SEMICOLON> 
-                        [Expression()] <SEMICOLON> 
-                        [Expression()] <RPAREN> 
-            Statement()
-}
-
-void ForVarStatement():
-{
-        Token t;
-}
-{
-        <FOR> <LPAREN>  t=<VAR> {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, 
-                                                             null, AnnotatedToken.PREFIX_WS);}
-                        VariableDeclarationList(t) <SEMICOLON> 
-                        [Expression()]  <SEMICOLON> 
-                        [Expression()]  <RPAREN> 
-            Statement()
-}
-
-void ForInStatement():
-{
-        Token t;
-}
-{
-        <FOR> <LPAREN>  ExpressionNoIN() 
-                        t=<IN> {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, 
-                                                            null, AnnotatedToken.INFIX_WS);}
-                        ExpressionNoIN() <RPAREN> 
-            Statement()
-}
- 
-void ForVarInStatement():
-{
-        Token t;
-}
-{
-        <FOR> <LPAREN>  
-                t=<VAR> {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.PREFIX_WS);}
-                t=Identifier() 
-                  {
-   	                  JSParserUtils.annotateToken(t, AnnotationConstants.VAR_IDENTIFIER, null, AnnotatedToken.PREFIX_WS);
-   	                  JSParserUtils.pushToken(_contextStack, (AnnotatedToken)t);
-                  }
-                [Initializer()] 
-                t=<IN> {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.INFIX_WS);}
-                ExpressionNoIN() 
-              <RPAREN> 
-            Statement()
-}
-
-void ContinueStatement():
-{}
-{
-        <CONTINUE> Sc()
-}
-
-void BreakStatement():
-{}
-{
-        <BREAK> Sc()
-}
- 
-void ReturnStatement():
-{
-        Token t;
-}
-{
-        t=<RETURN> {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.PREFIX_WS);}
-        [Expression()] Sc()
-}
-
-void WithStatement():
-{}
-{
-        <WITH> <LPAREN> Expression() <RPAREN>
-            Statement()
-}
-
-void TryStatement():
-{}
-{
-        <TRY> Block(null)
-        (<CATCH> <LPAREN> Identifier() <RPAREN> Block(null))*
-        [<FINALLY> Block(null)]
-} 
-
-void ThrowStatement():
-{
-        Token t;
-}
-{
-        t=<THROW> {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.PREFIX_WS);}
-        [Expression()] Sc()
-}
-
-void CaseGuard():
-{
-        Token t;
-}
-{
-        t=<CASE> {JSParserUtils.annotateToken(t, AnnotationConstants.UNDEFINED, null, AnnotatedToken.PREFIX_WS);}
-        Expression() <COLON>
-    |   <_DEFAULT> <COLON>
-}
-
-void CaseGroup():
-{}
-{
-        CaseGuard() (Statement())*  
-}
-
-void SwitchStatement():
-{}
-{
-        <SWITCH>    <LPAREN> Expression() <RPAREN> 
-                    <LBRACE> (CaseGroup())* <RBRACE>
-}
-
-void NamedFunction():
-{
-        Token  tIdentifier = null;
-        Token  tFunction   = null;
-        Token  blockStart  = null;
-        Token  blockEnd    = null;
-        Vector params      = new Vector();
-}
-{
-        tFunction=<FUNCTION> 
-        tIdentifier=Identifier() 
-           { 
-              JSParserUtils.annotateToken(tIdentifier, AnnotationConstants.FUNCTION_NAME_IDENTIFIER, 
-                                          null, -1); 
-              ProgramContext context = new ProgramContext(tIdentifier.image);
-              _contextStack.pushContext(context);
-           }
-        <LPAREN> 
-           [params=FormalParameterList()] 
-              { 
-                  JSParserUtils.annotateTokens(params,
-                                               AnnotationConstants.FUNCTION_PARAM_IDENTIFIER,
-                                               null, -1); 
-                  JSParserUtils.annotateToken(tFunction, AnnotationConstants.NAMED_FUNCTION,
-                                              params, AnnotatedToken.PREFIX_WS); 
-                  JSParserUtils.pushTokens(_contextStack, params);
-              } 
-
-        <RPAREN>
-        {blockStart = getToken(1);} 
-        Block(context)
-        {
-           blockEnd = getToken(1);
-           JSParserUtils.tagEvalCalls(tFunction, blockStart, blockEnd);
-        }
-}
-
-void AnonymousFunction():
-{
-        Token  tFunction  = null;
-        Token  blockStart = null;
-        Token  blockEnd   = null;
-        Vector params     = new Vector();
-}
-{
-        tFunction=<FUNCTION>
-           { 
-              ProgramContext context = new ProgramContext("anonymous");
-              _contextStack.pushContext(context);
-           } 
-        <LPAREN> 
-           [params=FormalParameterList()] 
-              { 
-                  JSParserUtils.annotateTokens(params,
-                                               AnnotationConstants.FUNCTION_PARAM_IDENTIFIER,
-                                               null, -1); 
-                  JSParserUtils.annotateToken(tFunction,
-                                              AnnotationConstants.ANONYMOUS_FUNCTION,
-                                              params, -1); 
-                  JSParserUtils.pushTokens(_contextStack, params);
-              } 
-        <RPAREN> 
-        {blockStart = getToken(1);}
-        Block(context)
-        {
-           blockEnd = getToken(1);
-           JSParserUtils.tagEvalCalls(tFunction, blockStart, blockEnd);
-        }
-}
-
-void FunctionConstructor():
-{}
-{    
-        <FUNCTION_> <LPAREN> ArgumentList() <RPAREN> 
-}
-
-void FunctionDeclaration():
-{}
-{
-        LOOKAHEAD(2) NamedFunction() 
-    |   LOOKAHEAD(2) AnonymousFunction()
-}           
-
-void FunctionLiteral():
-{}
-{
-        LOOKAHEAD(2) NamedFunction()
-    |   LOOKAHEAD(2) AnonymousFunction()
-}
-                          
-Vector FormalParameterList():
-{
-        Token  t = null;
-        Vector v = new Vector();
-}
-{
-        t=Identifier() {v.add(t);} 
-        (<COMMA> t=Identifier() {v.add(t);})*
-        {return v;}
-}
-
-void LiteralElement() :
-{}
-{
-        AssignmentExpression()
-}
-
-void ElementList():
-{}
-{
-        LiteralElement() (<COMMA> LiteralElement())*
-}
-
-void ArrayLiteral():
-{}
-{
-        LOOKAHEAD(2) <LBRACKET> <RBRACKET>
-    |   LOOKAHEAD(2) <LBRACKET> ElementList() <RBRACKET>
-}
-
-void NestedArrayLiteral():
-{}
-{
-        LOOKAHEAD(3) ArrayLiteral() 
-    |   LOOKAHEAD(3) <LBRACKET> NestedArrayLiteral() <RBRACKET>
-}
-
-void LiteralField():
-{
-        Token t = null;
-}
-{
-        t=Identifier()     <COLON> AssignmentExpression()
-        {JSParserUtils.annotateToken(t, AnnotationConstants.LITERAL_OBJECT_KEY_IDENTIFIER,null,-1); }
-   |    t=<STRING_LITERAL> <COLON> AssignmentExpression()
-        {JSParserUtils.annotateToken(t, AnnotationConstants.LITERAL_OBJECT_KEY_IDENTIFIER,null,-1); }
-}
-
-void FieldList():
-{}
-{
-        LiteralField() (<COMMA> LiteralField())*
-}
-
-void ObjectLiteral():
-{}
-{
-        LOOKAHEAD(2) <LBRACE> <RBRACE>
-    |   LOOKAHEAD(2) <LBRACE> FieldList() <RBRACE>  
-}
-
-
-Token Program():
-{
-        Token retval = getToken(1);
-}
-{
-        {_contextStack.pushContext(new ProgramContext("root"));}
-        (SourceElement())*  <EOF>
-        {
-            return retval;
-        }
-}
-
-void SourceElement():
-{}
-{
-        LOOKAHEAD(2)    Statement() 
-    |                   FunctionDeclaration()
-}
-
-void StatementList(): 
-{
-//        Token t;
-}
-{
-        (Statement())+
-}
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Detokenizer.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Detokenizer.java
deleted file mode 100644
index bdb12d2..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Detokenizer.java
+++ /dev/null
@@ -1,102 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.uixtools;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.io.PrintWriter;
-
-/**
- * Converts Token Objects into a JavaScript file
- * @version $Name:  $ ($Revision$) $Date$
- */
-public class Detokenizer
-{
-  private final PrintWriter _out;
-
-  /**
-   * @param out the file to write the output to.
-   */
-  public Detokenizer(PrintWriter out)
-  {
-    this._out = out;
-  }
-
-  /**
-   * Creates a new PrintWriter and calls the other constructor.
-   */
-  public Detokenizer(Writer out)
-  {
-    this(new PrintWriter(out));
-  }
-
-  /**
-   * decodes a token and writes the result
-   * @param tok the token to decode.
-   */
-  public void write(Token tok) throws IOException
-  {
-    int com = tok.code;
-    switch(com)
-      {
-      case Token.NEWLINE :
-        _out.println();
-        break;
-      case Token.WHITESPACE :
-        _out.print(' ');
-        break;
-      case Token.PERIOD :
-        _out.print('.');
-        break;
-      case Token.SEMICOLON :
-        _out.print(';');
-        break;
-      case Token.QUOTED :
-        {
-          char ch = tok.ch;
-          _out.print(ch+tok.string+ch);
-        }
-        break;
-      case Token.CONTROL :
-      case Token.LEFT_BRACE :
-      case Token.RIGHT_BRACE :
-        _out.print(tok.ch);
-        break;
-      case Token.NUMBER :
-      case Token.RESERVED :
-      case Token.NAME :
-        _out.print(tok.string);
-        break;
-      case Token.COMMENT :
-        _out.print("/*"+tok.string+"*/");
-        break;
-      case Token.REGULAR_EXP :
-        _out.print("/"+tok.string+"/");
-        break;
-      case Token.REGULAR_EXP_MODIFIER :
-        _out.print(tok.ch);
-        break;
-      case Token.EOF :
-        _out.close();
-        break;
-      default :
-        throw new RuntimeException("Unknown Token:"+tok);
-      }
-  }
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/FileProcessor.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/FileProcessor.java
deleted file mode 100644
index 750a626..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/FileProcessor.java
+++ /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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.uixtools;
-
-import java.io.File;
-import java.io.FilenameFilter;
-
-/**
- * This utility class can be used to perform some processing on input files,
- * and write the results to corresponding output files. It supports recursing
- * into subdirectories.
- * @version $Name:  $ ($Revision$) $Date$
- */
-public abstract class FileProcessor
-{
-  /**
-   * @param filenameExt the filename extension to accept. If null, all files
-   *  are accepted.
-   * @return a filter that only accepts files with names that end with the
-   *  specified extension. However, the filter accepts all subdirectories.
-   */
-  public static FilenameFilter getExtensionFilter(final String filenameExt)
-  {
-    return new FilenameFilter() {
-        public boolean accept(File dir, String name)
-        {
-          if ((filenameExt==null) || (name.endsWith(filenameExt))) return true;
-          File f = new File(dir, name);
-          return f.isDirectory();
-        }
-      };
-  }
-
-  /**
-   * @param filter used to select files and/or subdirectories.
-   * @param failFast if true, terminates at the first error (otherwise,
-   *  continues with the next file).
-   * @param overwrite if false, will not overwrite existing output files (That
-   *  particular input and output file will be skipped).
-   * @param verbose if true, generates verbose output.  */
-  public FileProcessor(FilenameFilter filter,
-                       boolean failFast, boolean overwrite, boolean verbose)
-  {
-    _filter = filter;
-    _failFast = failFast;
-    _dontOverwrite = !overwrite;
-    isVerbose = verbose;
-  }
-
-  /**
-   * Creates a Fileprocessor that overwrites all output files, and does not
-   * fail fast.
-   * @param filter used to select files and/or subdirectories.  */
-  public FileProcessor(FilenameFilter filter, boolean verbosity)
-  {
-    this(filter, false, true, verbosity);
-  }
-
-  /**
-   * Creates a Fileprocessor that overwrites all output files, and does not
-   * fail fast.
-   * @param extension the file extension to filter for. if this is null, all
-   * files and subdirectories in a directory will be processed recursively.
-   * @see #getExtensionFilter(String extension)
-   */
-  public FileProcessor(String extension, boolean verbosity)
-  {
-    this(getExtensionFilter(extension), verbosity);
-  }
-
-  /**
-   * @param in the input file or directory
-   * @param out if the input is a directory, then this must be the output
-   *  directory. Otherwise, this is the output file.
-   * @return true if there were no errors. false otherwise.  */
-  public boolean process(File in, File out)
-  {
-    if (isVerbose) System.out.println("Processing file:"+in+" to file:"+out);
-
-    if (in.isDirectory())
-    {
-      boolean success = true;
-      String[] names = in.list(_filter);
-      for(int i=0, sz=names.length; i<sz; i++)
-      {
-        File subIn = new File(in, names[i]);
-        File subOut = new File(out, names[i]);
-        success &= process(subIn, subOut);
-        if (_failFast && (!success)) return false;
-      }
-      return success;
-    }
-    else
-    {
-      try
-      {
-        if (_dontOverwrite && out.exists())
-        {
-          if (isVerbose) System.out.println("Skipping file:"+in+
-                                          " as destination file:"+out+
-                                          " already exists.");
-        }
-        else
-        {
-          out.getParentFile().mkdirs();
-          processFile(in, out);
-        }
-        return true;
-      }
-      catch (Exception e)
-      {
-        System.out.println("Error processing file:"+in+" to file:"+out);
-        e.printStackTrace();
-        return false;
-      }
-    }
-  }
-
-  /**
-   * Called to process a single file.
-   * @param in the input file. This is never a directory.
-   * @param out the output file. If this file exists and overwriting is not
-   * permitted, then this method is never called.
-   * @exception Exception if this class is set to <i>fail fast</i> then any
-   * exception thrown will cause all execution to halt. If this class does not
-   * fail fast, then the exception will be reported and execution will
-   * continue with the next file.  */
-  protected abstract void processFile(File in, File out) throws Exception;
-
-  /**
-   * If this is true, verbose output will be generated.
-   */
-  protected final boolean isVerbose;
-
-  private   final boolean _failFast, _dontOverwrite;
-  private   final FilenameFilter _filter;
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Filter1.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Filter1.java
deleted file mode 100644
index 6124982..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Filter1.java
+++ /dev/null
@@ -1,93 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.uixtools;
-
-import java.io.IOException;
-
-/**
- * Removes all comments and redundant whitespace
- * @version $Name:  $ ($Revision$) $Date$
- */
-public class Filter1 implements TokenReader
-{
-
-  /**
-   * blocks until is has read atleast one token from the input reader
-   */
-  public Filter1(TokenReader in) throws IOException, InterruptedException
-  {
-    _in = in;
-    _next = _in.read();
-  }
-
-  /**
-   * @see TokenReader
-   */
-  public Token read() throws IOException, InterruptedException
-  {
-    Token cur = _next;
-    Token res = cur;
-    for(;cur!=null;)
-      {
-        _next = _in.read();
-        res = _filter(_prev, cur, _next) ;
-        if (res!=null)
-          {
-            _prev = res;
-            break;
-          }
-        else cur = _next;
-      }
-    return res;
-  }
-
-  /**
-   * Removes extra spaces/newlines and all comments
-   */
-  private Token _filter(Token prev, Token cur, Token next)
-  {
-    //ystem.out.println("filtering token:"+cur);
-    int ccode = cur.code;
-    if ((ccode==Token.COMMENT) ||   //skip comments
-        ((ccode==Token.WHITESPACE) &&
-         !(_isSpaceSensitive(prev) && _isSpaceSensitive(next))) ||
-        ((ccode==Token.NEWLINE) &&
-         ((prev==null) || (prev.code==Token.NEWLINE))))
-      return null;
-    else return cur;
-  }
-
-  /**
-   * @return true if the given token is affected by whitespace preceding or
-   *  following it.
-   */
-  private boolean _isSpaceSensitive(Token tok)
-  {
-    if (tok==null) return false;
-    int i = tok.code;
-    if ((i == Token.NAME) || (i == Token.NUMBER) || (i == Token.RESERVED) ||
-        (i == Token.PERIOD))
-      return true;
-    else return false;
-  }
-
-  private final TokenReader _in;
-  private Token _prev = null;
-  private Token _next;
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Filter2.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Filter2.java
deleted file mode 100644
index 1133ee1..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Filter2.java
+++ /dev/null
@@ -1,322 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.uixtools;
-
-import java.io.IOException;
-
-import java.util.Vector;
-import java.util.HashMap;
-
-/**
- * Renames local variable names to short ones
- * @version $Name:  $ ($Revision$) $Date$
- */
-public class Filter2 implements TokenReader
-{
-
-  public Filter2(TokenReader in)
-  {
-    _in = in;
-    Runnable runner = new Runnable()
-      {
-        public void run()
-        {
-          try
-          {
-            //ystem.out.println("Compressor: start:"+Thread.currentThread());
-            _run();
-            //ystem.out.println("Comressor: end:"+Thread.currentThread());
-          }
-          catch (InterruptedException e)
-          {
-            e.printStackTrace();
-          }
-        }
-      };
-    new Thread(runner).start();
-  }
-
-  /**
-   * @see TokenReader#read()
-   */
-  public Token read() throws IOException, InterruptedException
-  {
-    return _buffer.read();
-  }
-
-  private void _run() throws InterruptedException
-  {
-    try
-    {
-      Token cur = _in.read();
-      for(;cur!=null;)
-      {
-        _process(cur);
-        cur = _in.read();
-      }
-    }
-    catch (IOException e)
-    {
-      _buffer.write(e);
-    }
-    catch (TokenException e)
-    {
-      e.printStackTrace();
-      _buffer.write(new IOException("Error parsing line:"+
-                                    e.getToken().lineNumber));
-    }
-    catch (RuntimeException e)
-    {
-      e.printStackTrace();
-      _buffer.write(new IOException());
-    }
-    _buffer.close();
-  }
-
-  /**
-   * renames local variable names to short names.
-   * First pass. sets a flag if this function uses the JS eval method.
-   */
-  private void _process(Token cur) throws InterruptedException
-  {
-    if ((cur.code == Token.LEFT_BRACE) && (cur.ch == '{'))
-      _openCurly++;
-    else if ((cur.code == Token.RIGHT_BRACE) && (cur.ch == '}'))
-      _openCurly--;
-
-
-    switch(_state)
-    {
-    case ROOT_MODE :
-      if ((cur.code==Token.RESERVED) && (cur.string.equals("function")))
-      {
-        _state = FUNCTION_PARAM_MODE;
-        _function.clear();
-        _isFunctionUsingEval = false;
-        _function.add(cur);
-      }
-      else _buffer.write(cur);
-      break;
-    case FUNCTION_PARAM_MODE :
-      _function.add(cur);
-      if ((cur.code==Token.LEFT_BRACE) && (cur.ch=='{'))
-      {
-        _state = FUNCTION_BODY_MODE;
-        _beginFunction = _openCurly;
-      }
-      break;
-    case FUNCTION_BODY_MODE :
-      _function.add(cur);
-      if (_openCurly<_beginFunction)
-      {
-        _state = ROOT_MODE;
-        if (_isFunctionUsingEval) _writeTokens(_function);
-        else
-        {
-          for(int i=0,sz=_function.size(); i<sz; i++)
-          {
-            _process2((Token) _function.get(i));
-          }
-        }
-      }
-      else if ((cur.code==Token.NAME) && cur.string.equals("eval"))
-      {
-        _isFunctionUsingEval = true;
-      }
-      break;
-    }
-  }
-
-  /**
-   * 2nd pass
-   * Does the actual renaming
-   */
-  private void _process2(Token cur) throws InterruptedException
-  {
-    if ((cur.code == Token.LEFT_BRACE) && (cur.ch == '{'))
-      _openCurly++;
-    else if ((cur.code == Token.RIGHT_BRACE) && (cur.ch == '}'))
-      _openCurly--;
-
-    switch(_state)
-    {
-    case ROOT_MODE :
-      if ((cur.code==Token.RESERVED) && (cur.string.equals("function")))
-        _state = FUNCTION_MODE;
-      break;
-    case FUNCTION_MODE :
-      if ((cur.code==Token.LEFT_BRACE) && (cur.ch=='('))
-      {
-        _state = FUNCTION_PARAM_MODE;
-        _localVarMap.clear();
-      }
-      else if (cur.code==Token.NAME)
-      {
-        //ystem.out.println("function name;"+cur.string);
-        _nameGen.reset();
-      }
-      break;
-    case FUNCTION_PARAM_MODE :
-      if ((cur.code==Token.LEFT_BRACE) && (cur.ch=='{'))
-      {
-        _state = FUNCTION_BODY_MODE;
-        _beginFunction = _openCurly;
-      }
-      else if (cur.code == Token.NAME)
-      {
-        //ystem.out.println(" param:"+cur.string);
-        Token tok = _getNewToken(cur);
-        cur = tok;
-      }
-      break;
-    case FUNCTION_BODY_MODE :
-      if (_openCurly<_beginFunction)
-      {
-        _state = ROOT_MODE;
-      }
-      else if (cur.code==Token.PERIOD)
-        _state = PERIOD_MODE;
-      else if ((cur.code==Token.RESERVED) && (cur.string.equals("var")))
-        _state = VAR_DEF_MODE;
-      else if (cur.code==Token.NAME)
-      {
-        cur = _substForToken(cur);
-      }
-      break;
-    case VAR_DEF_MODE :
-      if (cur.code==Token.NAME)
-      {
-        _state = FUNCTION_BODY_MODE;
-        //ystem.out.println(" local var:"+cur.string);
-        Token tok = _getNewToken(cur);
-        cur = tok;
-      }
-      break;
-    case PERIOD_MODE :
-      // this is just to skip the next token after a period.
-      _state = FUNCTION_BODY_MODE;
-      break;
-    }
-    _buffer.write(cur);
-  }
-
-  private void _writeTokens(Vector tokens) throws InterruptedException
-  {
-    for(int i=0,sz=tokens.size(); i<sz; i++)
-    {
-      _buffer.write((Token) tokens.get(i));
-    }
-  }
-
-  /**
-   * @return a new token to replace the old one with. the new one will have
-   *  a short name
-   */
-  private Token _getNewToken(Token oldToken)
-  {
-    String oldName = oldToken.string;
-    String newName = (String) _localVarMap.get(oldName);
-    if (newName==null)
-    {
-      newName = _nameGen.getNext();
-      _localVarMap.put(oldName, newName);
-    }
-    return new Token(oldToken.code, oldToken.lineNumber, newName);
-  }
-
-  /**
-   * @return the substitute token. if no token has been substituted for the
-   *  <code>oldToken</code> then the <code>oldToken</code> is returned.
-   * @param oldToken the token to substitute for.
-   */
-  private Token _substForToken(Token oldToken)
-  {
-    String oldName = oldToken.string;
-    String newName = (String) _localVarMap.get(oldName);
-    if (newName==null)
-    {
-      if (_nameGen.isInUse(oldName))
-        throw new TokenException(oldToken,
-                                 "Conflict with global var:"+oldName);
-      return oldToken;
-    }
-    Token tok = new Token(oldToken.code, oldToken.lineNumber, newName);
-    return tok;
-  }
-
-  private class NameGen
-  {
-    private int _i = 0;
-    private char _ch = 'a';
-    private final StringBuffer _sb = new StringBuffer();
-
-    /**
-     * @return a new unique short name
-     */
-    public String getNext()
-    {
-      _sb.setLength(0);
-      return _sb.append(_ch).append(_i++).toString();
-    }
-
-    public void reset()
-    {
-      _i = 0;
-    }
-
-    /**
-     * @return true if <code>varName</code> has already been returned by
-     *   the method <code>getNext()</code>
-     * @see #getNext()
-     */
-    public boolean isInUse(String varName)
-    {
-      int sz=varName.length();
-      if ((varName.charAt(0)!=_ch) || (sz<=1)) return false;
-
-      for(int i=1; i<sz; i++)
-      {
-        if (!Character.isDigit(varName.charAt(i))) return false;
-      }
-      String ipart = varName.substring(1);
-      int j = Integer.parseInt(ipart);
-      if (j >= _i) return false;
-      else return true;
-    }
-  }
-
-  private int _state = ROOT_MODE;
-  private int _openCurly = 0;
-  private int _beginFunction = 0;
-  private boolean _isFunctionUsingEval = false;
-
-  private final TokenReader _in;
-  private final NameGen _nameGen = new NameGen();
-  private final HashMap _localVarMap = new HashMap();
-  private final TokenBuffer _buffer = new TokenBuffer();
-  private final Vector _function = new Vector();
-
-  private static final int ROOT_MODE =           0;
-  private static final int FUNCTION_MODE =       1;
-  private static final int FUNCTION_PARAM_MODE = 2;
-  private static final int FUNCTION_BODY_MODE =  3;
-  private static final int VAR_DEF_MODE =        4;
-  private static final int PERIOD_MODE =         5;
-
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Queue.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Queue.java
deleted file mode 100644
index 8f596ea..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Queue.java
+++ /dev/null
@@ -1,210 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.uixtools;
-
-import java.util.List;
-
-/**
- * Implements a first-in-first-out (FIFO) queue. Typically, one thread will add
- * elements to this queue, and another will remove elements from this queue.
- * This class is thread safe.
- * @version $Name:  $ ($Revision$) $Date$
- */
-public class Queue
-{
-  /**
-   * @param size the maximum size of this queue
-   */
-  public Queue(int size)
-  {
-    if (size<=0)
-      throw new IllegalArgumentException("size is nonpositive:"+size);
-    _buf = new Object[size];
-  }
-
-  /**
-   * @return the number of elements in this queue. This will never be larger
-   * than the {@link #Queue(int) maximum size} of this queue.
-   */
-  public final synchronized int size()
-  {
-    return _size;
-  }
-
-  /**
-   * @return true if the queue has been closed.
-   * @see #close()
-   */
-  public final synchronized boolean isClosed()
-  {
-    return _closed;
-  }
-
-  /**
-   * closes this queue. Any consequent {@link #add(Object)} method calls will
-   * fail.  All {@link #get()} operations will succeed until the queue is
-   * empty. This method may be called multiple times.
-   * @see #isClosed()
-   */
-  public synchronized void close()
-  {
-    _closed = true;
-    notifyAll();
-  }
-
-  /**
-   * @return true if the queue is full and a call to {@link #add(Object)}
-   * would block.
-   */
-  public final boolean isFull()
-  {
-    return (size() == _buf.length);
-  }
-
-  /**
-   * @return true if the queue is empty and a call to {@link #get()}
-   * would block.
-   */
-  public final boolean isEmpty()
-  {
-    return (size() == 0);
-  }
-
-  /**
-   * This method blocks until space is available in this queue.
-   * @param obj the Object to add to the end of this queue. null is permitted.
-   * @exception InterruptedException if the current thread is interrupted.
-   * @exception IllegalStateException if queue is closed.
-   * @see #close()
-   * @see #remove()
-   */
-  public synchronized void add(Object obj)
-    throws InterruptedException, IllegalStateException
-  {
-    for(;isFull() && (!isClosed());)
-    {
-      //ystem.out.println("waiting to add. size");
-      wait();
-    }
-    //ystem.out.println("adding. size:"+size());
-
-    _checkIsClosed();
-
-    _buf[_head] = obj;
-    _head = _incIndex(_head);
-    _size++;
-    // yes, we are waking up all threads, including those that are
-    // waiting to do an add. This may be inefficient.
-    // note that we must do notifyAll() and not notify()
-    notifyAll();
-  }
-
-  /**
-   * This method blocks until some element is added to this queue, or the queue
-   * is closed.
-   * @return removes and returns the Object at the front of this queue.
-   * null may be returned if null was added using {@link #add(Object)}
-   * @exception InterruptedException if the current thread is interrupted.
-   * @exception IllegalStateException if queue is closed.
-   * @see #close()
-   * @see #add(Object)
-   * @see #remove(LIst,int)
-   */
-  public synchronized Object remove()
-    throws InterruptedException, IllegalStateException
-  {
-    for(;isEmpty();)
-    {
-      _checkIsClosed();
-      wait();
-    }
-
-    Object res = _buf[_tail];
-    _buf[_tail] = null; // allow garbage collect
-    _tail = _incIndex(_tail);
-    _size--;
-
-    // yes, we are waking up all threads, including those that are
-    // waiting to do a remove. This may be inefficient.
-    // note that we must do notifyAll() and not notify()
-    notifyAll();
-    return res;
-  }
-
-  /**
-   * Removes multiple elements. This method will block until there is something
-   * to remove.
-   * @param collector all the elements removed from this queue are added to
-   * the end of this List.
-   * @param count the maximum number of elements to remove. If this is zero,
-   * then it defaults to the maximum size of this queue.
-   * @return the number of elements actually removed.
-   * @see #remove()
-   */
-  public synchronized int remove(List collector, int count)
-    throws InterruptedException, IllegalStateException
-  {
-    collector.add(remove());
-
-    int sz = size()+1;
-    if ((count == 0) || (count > sz))
-      count = sz;
-    else if (count < 0)
-      throw new IllegalArgumentException("count is negative");
-
-    int read = 1;
-    try
-    {
-      for(;read < count; read++)
-      {
-        collector.add(remove());
-      }
-    }
-    catch(IllegalStateException e)
-    {
-      // this should not happen unless the user has subclassed remove() and
-      // done something weird
-    }
-    catch(InterruptedException e)
-    {
-      // this should not happen unless the user has subclassed remove() and
-      // done something weird
-
-      // mark this thread as interrupted, so that it doesn't block again.
-      Thread.currentThread().interrupt();
-    }
-    return read;
-  }
-
-  private int _incIndex(int index)
-  {
-    index++;
-    return (index < _buf.length) ? index : 0;
-  }
-
-  private void _checkIsClosed()
-  {
-    if (isClosed())
-      throw new IllegalStateException("Queue has been closed");
-  }
-
-  private final Object[] _buf;
-  private boolean _closed = false;
-  private int _size = 0, _head = 0, _tail = 0;
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Reducer.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Reducer.java
deleted file mode 100644
index db029e5..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Reducer.java
+++ /dev/null
@@ -1,136 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.uixtools;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-
-/**
- * Reduces JavaScript files by stripping comments and redundant whitespace
- * and renaming local variable names to shorter ones.
- * @version $Name:  $ ($Revision$) $Date$
- */
-public class Reducer extends FileProcessor
-{
-  /**
-   * creates a new Reducer.
-   * @param whitespaceComments if true removes comments and extra whitespace
-   * @param localVars if true renames local variable names to shorter ones.
-   */
-  public Reducer(boolean whitespaceComments, boolean localVars)
-  {
-    super(".js", false);
-    _STRIP_WHITESPACE_COMMENTS = whitespaceComments;
-    _RENAME_LOCAL_VARIABLES = localVars;
-  }
-
-  public Reducer()
-  {
-    this(true, true);
-  }
-
-  /**
-   * reduces a JavaScript file.
-   * @param in the source to read from
-   * @param out the source to write the reduced form to
-   */
-  public void process(BufferedReader in, PrintWriter out)
-    throws IOException, InterruptedException
-  {
-    TokenReader tr = new Tokenizer(in);
-    if (_STRIP_WHITESPACE_COMMENTS) tr = new Filter1(tr);
-    if (_RENAME_LOCAL_VARIABLES) tr = new Filter2(tr);
-    Detokenizer detok = new Detokenizer(out);
-    for(;;)
-    {
-      Token tok = tr.read();
-      if (tok==null) break;
-      else detok.write(tok);
-    }
-  }
-
-  /**
-   * @see FileProcessor#processFile(File, File)
-   */
-  protected void processFile(File in, File out)
-    throws IOException, InterruptedException
-  {
-    BufferedReader reader = new BufferedReader(new FileReader(in));
-    PrintWriter writer =  new PrintWriter(new FileWriter(out));
-    process(reader, writer);
-    writer.close();
-    reader.close();
-  }
-
-  private static void _help()
-  {
-    String s;
-    s = "Reduces JavaScript source code\n" +
-      "Usage:\n" +
-      "java oracle.uix.tools.uix22.javascript.Reducer" +
-      " [-norename] [-whitespace] [-help] input output \n" +
-      " input/output can be either files or directories.\n" +
-      " Directories will be processed recursively.\n" +
-      " Only files with names that end with .js will be processed.\n" +
-      " -norename prevents renaming local variables to short ones\n" +
-      " -whitespace prevents removing comments and extra whitespace\n" +
-      " -help prints this message.";
-    System.out.println(s);
-  }
-
-  public static void main(String[] args)
-  {
-    boolean rename = true;
-    boolean space = true;
-
-    final int sz = args.length-2;
-
-    if (sz<0)
-    {
-      _help();
-      return;
-    }
-
-    for(int i=0; i<sz; i++)
-    {
-      String s = args[i];
-      if (s.equals("-help")) _help();
-      else if (s.equals("-norename")) rename = false;
-      else if (s.equals("-whitespace")) space = false;
-      else
-      {
-        System.out.println("Unknown option:"+s);
-        _help();
-        return;
-      }
-    }
-
-    File in = new File(args[sz]);
-    File out = new File(args[sz+1]);
-    Reducer reducer = new Reducer(space, rename);
-    reducer.process(in, out);
-  }
-
-  private final boolean _STRIP_WHITESPACE_COMMENTS;
-  private final boolean _RENAME_LOCAL_VARIABLES;
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Token.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Token.java
deleted file mode 100644
index 23b3412..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Token.java
+++ /dev/null
@@ -1,77 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.uixtools;
-
-/**
- * Tokens for JavaScript source code
- * @version $Name:  $ ($Revision$) $Date$
- */
-public class Token
-{
-
-  public Token(int code, int lineNumber)
-  {
-    this(code, lineNumber, (char) 0, (String) null);
-  }
-
-  public Token(int code, int lineNumber, char ch)
-  {
-    this(code, lineNumber, ch, (String) null);
-  }
-
-  public Token(int code, int lineNumber, String s)
-  {
-    this(code, lineNumber, (char) 0, s);
-  }
-
-  public Token(int code, int lineNumber, char ch, String s)
-  {
-    this.code=code;
-    this.lineNumber = lineNumber;
-    this.ch=ch;
-    string = s;
-  }
-
-  public String toString()
-  {
-    return "Token code:"+code+" line:"+lineNumber+
-      " char:"+ch+" string:"+string;
-  }
-
-  public final int code, lineNumber;
-  public final char ch;
-  public final String string;
-
-  public static final int EOF =                 0;
-  public static final int NEWLINE =             10;
-  public static final int WHITESPACE =          11;
-  public static final int PERIOD =              12;
-  public static final int SEMICOLON =           13;
-  public static final int QUOTED =              20;
-  public static final int NAME =                30;
-  public static final int NUMBER =              40;
-  public static final int COMMENT =             50;
-  public static final int REGULAR_EXP =         60;
-  public static final int REGULAR_EXP_MODIFIER =65;
-  public static final int CONTROL =             100;
-  public static final int LEFT_BRACE =          110;
-  public static final int RIGHT_BRACE =         120;
-  public static final int RESERVED =            200; //reserved words
-
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/TokenBuffer.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/TokenBuffer.java
deleted file mode 100644
index 82cc031..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/TokenBuffer.java
+++ /dev/null
@@ -1,98 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.uixtools;
-
-import java.io.IOException;
-
-/**
- * A buffer to hold Token objects. Tokens can be read from and written to this
- * buffer as if it were a queue. it is thread safe. Best if a single thread is
- * reading and a single thread is writing.
- * @version $Name:  $ ($Revision$) $Date$
- */
-public class TokenBuffer extends Queue implements TokenReader
-{
-
-  /**
-   * @param bufferSize the maximum size of this buffer.
-   */
-  public TokenBuffer(int bufferSize)
-  {
-    super(bufferSize);
-  }
-
-  public TokenBuffer()
-  {
-    this(100);
-  }
-
-  /**
-   * reads a Token from this buffer. This method blocks until data is available
-   * @return null if there is no more data and this buffer has been closed.
-   * @see TokenReader
-   */
-  public synchronized Token read() throws IOException, InterruptedException
-  {
-    Token tok;
-    try
-    {
-      tok = (Token) super.remove();
-    }
-    catch (IllegalStateException e)
-    {
-      tok = null;
-    }
-
-    if (tok==_EXCEPTION_TOKEN)
-    {
-      throw _getException();
-    }
-    return tok;
-  }
-
-  /**
-   * This method blocks if the buffer is full.
-   * @param tok the token to write to this buffer
-   */
-  public synchronized void write(Token tok) throws InterruptedException
-  {
-    super.add(tok);
-  }
-
-  public synchronized void write(IOException e) throws InterruptedException
-  {
-    _setException(e);
-    write(_EXCEPTION_TOKEN);
-    close();
-  }
-
-  private synchronized void _setException(IOException e)
-  {
-    _exception = e;
-  }
-
-  private synchronized IOException _getException()
-  {
-    return _exception;
-  }
-
-  private IOException _exception = null;
-
-  private static final Token _EXCEPTION_TOKEN = new Token(-1, 0);
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/TokenException.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/TokenException.java
deleted file mode 100644
index 6c10b07..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/TokenException.java
+++ /dev/null
@@ -1,38 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.uixtools;
-
-/**
- * @version $Name:  $ ($Revision$) $Date$
- */
-public class TokenException extends RuntimeException
-{
-  private final Token _token;
-
-  public TokenException(Token token, String message)
-  {
-    super(message);
-    _token = token;
-  }
-
-  public Token getToken()
-  {
-    return _token;
-  }
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/TokenReader.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/TokenReader.java
deleted file mode 100644
index ba86a75..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/TokenReader.java
+++ /dev/null
@@ -1,35 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.uixtools;
-
-import java.io.IOException;
-
-/**
- * @version $Name:  $ ($Revision$) $Date$
- */
-public interface TokenReader
-{
-
-  /*
-   * Reads a Token from this source. This method will block until data
-   * becomes available.
-   * @return null if there is no more data and EOF is reached.
-   */
-  public Token read() throws IOException, InterruptedException;
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Tokenizer.java b/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Tokenizer.java
deleted file mode 100644
index a67ebe5..0000000
--- a/maven2-plugins/myfaces-javascript-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/javascript/uixtools/Tokenizer.java
+++ /dev/null
@@ -1,423 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.javascript.uixtools;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-
-/**
- * A Tokenizer for JavaScript source files.
- * @version $Name:  $ ($Revision$) $Date$
- */
-public class Tokenizer implements TokenReader
-{
-
-  /**
-   * @param in used to read data from the JS file
-   */
-  public Tokenizer(BufferedReader in)
-  {
-    _in = in;
-    Runnable runner = new Runnable()
-      {
-        public void run()
-        {
-          //ystem.out.println("Tokenizer: start:"+Thread.currentThread());
-          _run();
-          //ystem.out.println("Tokenizer: end:"+Thread.currentThread());
-        }
-      };
-    new Thread(runner).start();
-  }
-
-  /**
-   * reads a Token. blocks until a Token is available.
-   * @return null if the EOF is reached.
-   */
-  public Token read() throws IOException, InterruptedException
-  {
-    return _out.read();
-  }
-
-  private void _run()
-  {
-    try
-      {
-        _run2();
-      }
-    catch (Exception e)
-      {
-        System.out.println("Exception parsing line:"+_lineNumber);
-        e.printStackTrace();
-      }
-  }
-
-  private void _run2() throws InterruptedException
-  {
-    try
-    {
-      for(;_fillBuffer();)
-      {
-        //ystem.out.println("begin process");
-        _processBuffer();
-        //ystem.out.println("end process");
-      }
-      _out.write(new Token(Token.EOF, _lineNumber));
-    }
-    catch (IOException e)
-    {
-      System.out.println("Exception parsing line:"+_lineNumber);
-      _out.write(e);
-    }
-    catch (Exception e)
-    {
-      e.printStackTrace();
-      _out.write(new IOException("Exception parsing line:"+_lineNumber));
-    }
-    finally
-    {
-      _out.close();
-    }
-  }
-
-  private void _processBuffer() throws InterruptedException
-  {
-    _offset = 0;
-
-    for(;_offset<_len;)
-      {
-        //ystem.out.println("line:"+_lineNumber+" offset:"+_offset);
-        char ch = _buffer.charAt(_offset++);
-        switch(_status)
-          {
-          case ROOT_MODE :
-          case DIVISION_MODE :
-            _next = _rootMode(ch, _status);
-            break;
-          case READ_WORD_MODE :
-            _next = _readWordMode(ch, _status, _str);
-            break;
-          case QUOTE1_MODE :
-          case QUOTE2_MODE :
-            _next = _quoteMode(ch, _status, _prev, _str);
-            break;
-          case ESCAPED_CHAR_MODE :
-            _str.append('\\');
-            _str.append(ch);
-            _next = _prev;
-            break;
-          case POSSIBLE_COMMENT_MODE :
-            if (ch=='/') _next = COMMENT1_MODE;
-            else if (ch=='*') _next = COMMENT2_MODE;
-            else
-              {
-                _offset--; //Roll Back one
-                if (_prev == DIVISION_MODE)
-                  {
-                    _writeControl('/');
-                    _next = ROOT_MODE;
-                  }
-                else
-                  {
-                    _next = REGULAR_EXP_MODE;
-                  }
-              }
-            break;
-          case COMMENT1_MODE :
-          case COMMENT2_MODE :
-          case END_COMMENT_MODE :
-            _next = _commentMode(ch, _status, _str);
-            break;
-          case REGULAR_EXP_MODE :
-            _next = _regularExpMode(ch, _str);
-            break;
-          case END_REGULAR_EXP_MODE :
-            if ((ch=='g') || (ch=='i'))
-              {
-                _out.write(new Token(Token.REGULAR_EXP_MODIFIER,
-                                     _lineNumber,
-                                     ch));
-                _next = END_REGULAR_EXP_MODE;
-              }
-            else
-              {
-                _offset--; //Rollback
-                _next = ROOT_MODE;
-              }
-            break;
-          }
-        _prev = _status;
-        _status = _next;
-      }
-  }
-
-  private int _rootMode(char ch, int status) throws InterruptedException
-  {
-    switch(ch)
-      {
-      case '\'' :
-        return QUOTE1_MODE;
-      case '\"' :
-        return QUOTE2_MODE;
-      case ' '  :
-      case '\t' :
-        _out.write(WHITESPACE);
-        return status;
-      case '\n' :
-        _out.write(NEWLINE);
-        return ROOT_MODE;
-      case '.' :
-        _out.write(PERIOD);
-        return status;
-      case ';' :
-        _out.write(SEMICOLON);
-        return ROOT_MODE;
-      case '(' :
-      case '{' :
-      case '[' :
-        _out.write(new Token(Token.LEFT_BRACE, _lineNumber, ch));
-        return ROOT_MODE;
-      case ')' :
-        _out.write(new Token(Token.RIGHT_BRACE, _lineNumber, ch));
-        return DIVISION_MODE;
-      case '}' :
-      case ']' :
-        _out.write(new Token(Token.RIGHT_BRACE, _lineNumber, ch));
-        return ROOT_MODE;
-      case '/'  : return POSSIBLE_COMMENT_MODE;
-      default :
-        if (_isAlphaNumeric(ch))
-          {
-            _offset--; //Rollback
-            return READ_WORD_MODE;
-          }
-        else
-          {
-            _writeControl(ch);
-            return ROOT_MODE;
-          }
-      }
-  }
-
-  private int _regularExpMode(char ch, StringBuffer regExp)
-    throws InterruptedException
-  {
-    switch(ch)
-      {
-      case '\\' :
-        return ESCAPED_CHAR_MODE;
-      case '/' :
-        _out.write(new Token(Token.REGULAR_EXP,
-                             _lineNumber,
-                             regExp.toString()));
-        regExp.setLength(0);
-        return END_REGULAR_EXP_MODE;
-      default :
-        regExp.append(ch);
-        return REGULAR_EXP_MODE;
-      }
-  }
-
-  private int _quoteMode(char ch, int status, int prev,
-                         StringBuffer quoteString) throws InterruptedException
-  {
-    if (((ch=='\'') && (status==QUOTE1_MODE)) ||
-        ((ch=='\"') && (status==QUOTE2_MODE)))
-      {
-        _out.write(new Token(Token.QUOTED,
-                             _lineNumber, ch, quoteString.toString()));
-        quoteString.setLength(0);
-        return ROOT_MODE;
-      }
-    else if (ch=='\\') return ESCAPED_CHAR_MODE;
-    else
-      {
-        quoteString.append(ch);
-        return status;
-      }
-  }
-
-  private int _commentMode(char ch, int status,
-                           StringBuffer commentString)
-    throws InterruptedException
-  {
-    if (status==END_COMMENT_MODE)
-      {
-        if (ch=='/')
-          {
-            _writeComment(commentString);
-            return ROOT_MODE;
-          }
-        else
-          {
-            commentString.append('*');
-            _offset--; //Roll back
-            return COMMENT2_MODE;
-          }
-      }
-    else if ((status==COMMENT2_MODE) && (ch=='*'))
-      {
-        return END_COMMENT_MODE;
-      }
-    else if ((status==COMMENT1_MODE) && (ch=='\n'))
-      {
-        _writeComment(commentString);
-        _out.write(NEWLINE);
-        return ROOT_MODE;
-      }
-    else
-      {
-        commentString.append(ch);
-        return status;
-      }
-  }
-
-  private int _readWordMode(char ch, int status, StringBuffer wordBuffer)
-    throws InterruptedException
-  {
-    if (_isAlphaNumeric(ch))
-      {
-        wordBuffer.append(ch);
-        return status;
-      }
-    else
-      {
-        _writeAlphaNumeric(wordBuffer.toString());
-        wordBuffer.setLength(0);
-        _offset--; //Rollback
-        return DIVISION_MODE;
-      }
-  }
-
-  private void _writeComment(StringBuffer s) throws InterruptedException
-  {
-    _out.write(new Token(Token.COMMENT, _lineNumber, s.toString()));
-    s.setLength(0);
-  }
-
-  private void _writeControl(char ch) throws InterruptedException
-  {
-    _out.write(new Token(Token.CONTROL, _lineNumber, ch));
-  }
-
-  private void _writeAlphaNumeric(String s) throws InterruptedException
-  {
-    if (Character.isDigit(s.charAt(0)))
-      {
-        _out.write(new Token(Token.NUMBER, _lineNumber, s));
-      }
-    else if (_isReservedKeyword(s))
-      {
-        _out.write(new Token(Token.RESERVED, _lineNumber, s));
-      }
-    else
-      {
-        _out.write(new Token(Token.NAME, _lineNumber, s));
-      }
-  }
-
-  private boolean _isReservedKeyword(String s)
-  {
-    for(int i=0; i<reservedWords.length; i++)
-      {
-        if (s.equals(reservedWords[i])) return true;
-      }
-    return false;
-  }
-
-  private boolean _isAlphaNumeric(char ch)
-  {
-    return Character.isLetterOrDigit(ch) || (ch=='_') ;
-  }
-
-  /**
-   * @return false if EOF
-   */
-  private boolean _fillBuffer() throws IOException
-  {
-    _buffer.setLength(0);
-    String s = _in.readLine();
-    if (s==null)
-      {
-        _len=0;
-        return false;
-      }
-    else
-      {
-        _buffer.append(s).append('\n');
-        _len = _buffer.length();
-        _lineNumber++;
-        return true;
-      }
-  }
-
-  private void _reset()
-  {
-    _status = _prev = _next = ROOT_MODE;
-    _buffer.setLength(0);
-    _len = _lineNumber = _offset = 0;
-    _wordBuffer.setLength(0);
-    _str.setLength(0);
-  }
-
-  private int _status = ROOT_MODE;
-  private int _prev = ROOT_MODE;
-  private int _next = ROOT_MODE;
-
-  private int _len = 0;
-  private int _lineNumber = 0;
-  private int _offset = 0;
-
-  private final StringBuffer _buffer = new StringBuffer();
-  private final StringBuffer _wordBuffer = new StringBuffer();
-  private final StringBuffer _str = new StringBuffer();
-
-  private final BufferedReader _in;
-  private final TokenBuffer _out = new TokenBuffer();
-
-  /**
-   * These are not all the reserved words in JS but are the only ones
-   * important to the filters.
-   */
-  private static final String[] reservedWords =
-  {
-    "function", "var"
-  };
-
-  private final Token NEWLINE = new Token(Token.NEWLINE, 0);
-  private final Token WHITESPACE = new Token(Token.WHITESPACE, 0);
-  private final Token PERIOD = new Token(Token.PERIOD, 0);
-  private final Token SEMICOLON = new Token(Token.SEMICOLON, 0);
-
-  /**
-   * These are the FSM states
-   */
-  private static final int ROOT_MODE = 0;
-  private static final int READ_WORD_MODE = 10;
-  private static final int DIVISION_MODE = 15;
-  private static final int QUOTE1_MODE = 20;
-  private static final int QUOTE2_MODE = 30;
-  private static final int ESCAPED_CHAR_MODE = 40;
-  private static final int POSSIBLE_COMMENT_MODE = 50;
-  private static final int COMMENT1_MODE = 60;
-  private static final int COMMENT2_MODE = 70;
-  private static final int END_COMMENT_MODE = 80;
-  private static final int REGULAR_EXP_MODE = 90;
-  private static final int END_REGULAR_EXP_MODE = 95;
-}
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-jdev-plugin/LICENSE.txt b/maven2-plugins/myfaces-jdev-plugin/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/maven2-plugins/myfaces-jdev-plugin/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/maven2-plugins/myfaces-jdev-plugin/NOTICE.txt b/maven2-plugins/myfaces-jdev-plugin/NOTICE.txt
deleted file mode 100644
index fa3dbd6..0000000
--- a/maven2-plugins/myfaces-jdev-plugin/NOTICE.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-=========================================================================
-==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
-==  Version 2.0, in this case for the Apache MyFaces Maven Plugins     ==
-=========================================================================
-
-This product includes software developed by 
-The Apache Software Foundation (http://www.apache.org/).
-
-Portions of this software were originally based on the following:
-
- - software copyright (c) 2000-2006, Oracle Corp, <http://www.oracle.com/>.
-and are licensed to the Apache Software Foundation under the 
-"Software Grant and Corporate Contribution License Agreement"
-
-See the LICENSE.txt file for information on all licenses 
-associated with this software.
diff --git a/maven2-plugins/myfaces-jdev-plugin/pom.xml b/maven2-plugins/myfaces-jdev-plugin/pom.xml
deleted file mode 100644
index 87c992f..0000000
--- a/maven2-plugins/myfaces-jdev-plugin/pom.xml
+++ /dev/null
@@ -1,72 +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.
--->
-
-<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>
-    <groupId>org.apache.myfaces.buildtools</groupId>
-    <artifactId>myfaces-plugin-parent</artifactId>
-    <version>1.0.2</version>
-  </parent>
-
-  <groupId>org.apache.myfaces.buildtools</groupId>
-  <artifactId>myfaces-jdev-plugin</artifactId>
-  <version>1.0.1-SNAPSHOT</version>
-  <packaging>maven-plugin</packaging>
-  <name>Apache MyFaces Buildtools Maven2 JDev Plugin</name>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId>
-      <version>2.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-      <version>2.0</version>
-    </dependency>
-    <dependency>
-      <groupId>stax</groupId>
-      <artifactId>stax-api</artifactId>
-      <version>1.0.1</version>
-    </dependency>
-    <dependency>
-      <groupId>stax</groupId>
-      <artifactId>stax</artifactId>
-      <version>1.2.0_rc2-dev</version>
-    </dependency>
-  </dependencies>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-plugin-plugin</artifactId>
-        <version>2.2</version>
-      </plugin>
-    </plugins>
-  </reporting>
-
-</project>
diff --git a/maven2-plugins/myfaces-jdev-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/JDeveloperMojo.java b/maven2-plugins/myfaces-jdev-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/JDeveloperMojo.java
deleted file mode 100644
index 987857a..0000000
--- a/maven2-plugins/myfaces-jdev-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/JDeveloperMojo.java
+++ /dev/null
@@ -1,1827 +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.
- */
-
-package org.apache.myfaces.buildtools.maven2.plugin.jdeveloper;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-
-import java.net.URL;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.model.Resource;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-
-import org.codehaus.plexus.util.DirectoryScanner;
-import org.codehaus.plexus.util.FileUtils;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.xml.Xpp3Dom;
-import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
-import org.codehaus.plexus.util.xml.Xpp3DomWriter;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-
-import org.xml.sax.SAXException;
-
-  /*
-   * Important informational note:
-   *
-   * The following XML code is similar to what would be seen in a pom file
-   * under the maven-jdev-plugin tag if Libraries (e.g. JSP Runtime
-   * and JSF 1.2) and Distributed Tag Libraries wanted to be added to the .jpr
-   * project.
-   *
-   * What you see below are the defaults that are put in a project's .jpr
-   * automatically without specifying anything.  See replaceLibraries(),
-   * replaceTagLibraries() and replaceDefaultTagLibraries().
-   *
-   * Also note that by setting the property "jdev.plugin.add.libraries" to
-   * false in a project's pom.xml file, no libraries will be added, default
-   * or otherwise.  In kind, setting the property "jdev.plugin.add.taglibs"
-   * to false will result in no tag libraries of any kind being added.
-   *
-   * As you would expect, the default for both of these properties is "true".
-   *
-   *   <plugin>
-        <groupId>org.apache.myfaces.trinidadbuild</groupId>
-        <artifactId>maven-jdev-plugin</artifactId>
-        <version>1.2.4-SNAPSHOT</version>
-        <inherited>true</inherited>
-        <configuration>
-          <libraries>
-            <library>JSP Runtime</library>
-            <library>JSF 1.2</library>
-          </libraries>
-          <distributedTagLibraries>
-            <distributedTagLibrary>
-              <property>
-                <name>name</name>
-                <value>JSF HTML</value>
-              </property>
-              <property>
-                <name>version</name>
-                <value>1.2</value>
-              </property>
-              <property>
-                <name>jspVersion</name>
-                <value>2.1</value>
-              </property>
-              <property>
-                <name>tld</name>
-                <value>html_basic.tld</value>
-              </property>
-              <property>
-                <name>URI</name>
-                <value>http://java.sun.com/jsf/html</value>
-              </property>
-            </distributedTagLibrary>
-            <distributedTagLibrary>
-              <property>
-                <name>name</name>
-                <value>JSF Core</value>
-              </property>
-              <property>
-                <name>version</name>
-                <value>1.2</value>
-              </property>
-              <property>
-                <name>jspVersion</name>
-                <value>2.1</value>
-              </property>
-              <property>
-                <name>tld</name>
-                <value>jsf_core.tld</value>
-              </property>
-              <property>
-                <name>URI</name>
-                <value>http://java.sun.com/jsf/core</value>
-              </property>
-            </distributedTagLibrary>
-          </distributedTagLibraries>
-        </configuration>
-      </plugin>
- */
-
-/**
- * Generates the JDeveloper Workspace and Projects
- * from a maven development environment.
- * @version $Id$
- * @goal jdev
- * @execute phase=process-resources
- * @requiresDependencyResolution test
- * @description Goal which generates the JDeveloper Workspace and Projects
- *              from a maven development environment.
- */
-public class JDeveloperMojo
-  extends AbstractMojo
-{
-  /**
-   * Libraries to include in Classpath.
-   * @parameter
-   */
-  private String[] libraries;
-
-  /**
-   * List of source root directories
-   * @parameter
-   */
-  private File[] sourceRoots;
-
-  /**
-   * List of source root directories for the test project
-   * @parameter
-   */
-  private File[] testSourceRoots;
-
-  /**
-   * List of resource root directories
-   * @parameter
-   */
-  private File[] resourceRoots;
-
-  /**
-   * List of resource root directories for the test project
-   * @parameter
-   */
-  private File[] testResourceRoots;
-
-  /**
-   * Force the Mojo to use the default project.xml or
-   * workspace.xml file to be used in creation of the
-   * workspace file (.jws) or project file (.jpr). Otherwise,
-   * if a .jws or .jpr exists, it will be used instead.
-   * @parameter expression="${force}" default-value=false
-   *
-   */
-  private boolean force;
-
-  /**
-   * Compiler to be used by JDeveloper. "Ojc" is the default.  
-   * If this parameter is absent or anything other than "Javac", "Ojc" will
-   * be used.
-   * @parameter expression="${jdev.compiler}" default-value="Ojc"
-   */
-  private String compiler;
-
-  /**
-   * Make the entire project before each run.  Running anything in the
-   * project will automatically trigger a make of the entire project
-   * followed by the run.
-   * @parameter expression="${jdev.make.project}" default-value="false"
-   */
-  private boolean makeProject;
-
-  /**
-   * Default file to be run when JDeveloper project is run.
-   * @parameter expression="${jdev.run.target}"
-   */
-  private String runTarget;
-
-  /**
-   * Create JDeveloper Workspace and Project Files that correspond to
-   * the format used
-   * @parameter expression="${jdev.release}" default-value="10.1.3.0.4"
-   */
-  private String release;
-
-  /**
-   * Name of the Maven Project
-   * @parameter expression="${project}"
-   * @required
-   * @readonly
-   */
-  private MavenProject project;
-
-  /**
-   * List of reactorProjects
-   * @parameter expression="${reactorProjects}"
-   * @required
-   * @readonly
-   */
-  private List reactorProjects;
-
-  /**
-   * Tag library directory used by each distributed tag library
-   *
-   * @parameter expression="${jdev.tag.lib.dir}"
-   *            default-value="@oracle.home@lib/java/shared/oracle.jsf/1.2/jsf-ri.jar!/META-INF"
-   */
-  private String tagLibDirectory;
-
-  /**
-   * Tag libraries and their properties.
-   * @parameter
-   */
-  private Properties[] distributedTagLibraries;
-
-  /**
-   * Execute the Mojo.
-   */
-  public void execute()
-    throws MojoExecutionException
-  {
-    _parseRelease();
-    try
-    {
-      generateWorkspace();
-      generateProject();
-      generateTestProject();
-    }
-    catch (IOException e)
-    {
-      throw new MojoExecutionException(e.getMessage());
-    }
-  }
-
-  private void generateWorkspace()
-    throws MojoExecutionException, IOException
-  {
-    if (!project.getCollectedProjects().isEmpty())
-    {
-      getLog().info("Generating JDeveloper " + release + " workspace: " +
-                    project.getArtifactId());
-
-      File workspaceFile = getJWorkspaceFile(project);
-
-      try
-      {
-        Xpp3Dom workspaceDOM = readWorkspaceDOM(workspaceFile);
-        replaceProjects(workspaceFile.getParentFile(), workspaceDOM);
-        writeDOM(workspaceFile, workspaceDOM);
-      }
-      catch (XmlPullParserException e)
-      {
-        throw new MojoExecutionException("Error generating workspace", e);
-      }
-    }
-  }
-
-  private void generateProject()
-    throws IOException, MojoExecutionException
-  {
-    if (!"pom".equals(project.getPackaging()))
-    {
-      File projectFile = getJProjectFile(project);
-
-      // Get Project Properties to tell Mojo whether or not to add
-      // library refs and taglibs to the project.
-      Properties props = project.getProperties();
-      String addLibs = (String)props.get(_PROPERTY_ADD_LIBRARY);
-      String addTagLibs = (String)props.get(_PROPERTY_ADD_TAGLIBS);
-      _addLibraries = (addLibs == null)
-        ? true : (new Boolean(addLibs)).booleanValue();
-      _addTagLibs   = (addTagLibs == null)
-        ? true : (new Boolean(addTagLibs)).booleanValue();
-
-      // TODO: read configuration for war:war goal
-      File webappDir = new File(project.getBasedir(), "src/main/webapp");
-      // TODO: read configuration for compiler:complie goal
-      File outputDir =
-        new File(project.getBuild().getDirectory(), "classes");
-
-      MavenProject executionProject = project.getExecutionProject();
-      List compileSourceRoots = executionProject.getCompileSourceRoots();
-      if (sourceRoots != null)
-      {
-        for (int i = 0; i < sourceRoots.length; i++)
-        {
-          compileSourceRoots.add(sourceRoots[i].getAbsolutePath());
-        }
-      }
-
-      List compileResourceRoots = executionProject.getResources();
-      if (resourceRoots != null)
-      {
-        for (int i = 0; i < resourceRoots.length; i++)
-        {
-          Resource resource = new Resource();
-          resource.setDirectory(resourceRoots[i].getAbsolutePath());
-          compileResourceRoots.add(resource);
-        }
-      }
-
-      getLog().info("Generating JDeveloper " + release + " Project " +
-                    project.getArtifactId());
-
-      Set pluginArtifacts = new LinkedHashSet();
-      pluginArtifacts.addAll(project.getPluginArtifacts());
-
-      // Note: include "compile", "provided", "system" and "runtime" scopes
-      Set compileArtifacts = new LinkedHashSet();
-      compileArtifacts.addAll(project.getCompileArtifacts());
-      compileArtifacts.addAll(project.getRuntimeArtifacts());
-
-      // Note: separate "runtime" vs. "compile" dependencies in JDeveloper?
-      generateProject(projectFile, project.getArtifactId(),
-                      project.getPackaging(), project.getDependencies(),
-                      new ArrayList(compileArtifacts), compileSourceRoots,
-                      compileResourceRoots,
-                      Collections.singletonList(webappDir.getPath()),
-                      outputDir);
-    }
-  }
-
-  private void generateTestProject()
-    throws IOException, MojoExecutionException
-  {
-    if (!"pom".equals(project.getPackaging()))
-    {
-      File projectFile = getJProjectTestFile(project);
-
-      // Get Project Properties to tell Mojo whether or not to add
-      // library refs and taglibs to the project.
-      Properties props = project.getProperties();
-      String addLibs = (String)props.get(_PROPERTY_ADD_LIBRARY);
-      String addTagLibs = (String)props.get(_PROPERTY_ADD_TAGLIBS);
-      _addLibraries = (addLibs == null)
-        ? true : (new Boolean(addLibs)).booleanValue();
-      _addTagLibs   = (addTagLibs == null)
-        ? true : (new Boolean(addTagLibs)).booleanValue();
-      File webappDir = new File(project.getBasedir(), "src/test/webapp");
-      // TODO: read configuration for compiler:testCompile goal
-      File outputDir =
-        new File(project.getBuild().getDirectory(), "test-classes");
-
-      // self dependency needed for test project
-      List testDependencies = new ArrayList(project.getTestDependencies());
-      Dependency selfDependency = new Dependency();
-      selfDependency.setArtifactId(project.getArtifactId());
-      selfDependency.setGroupId(project.getGroupId());
-      selfDependency.setType(project.getPackaging());
-      testDependencies.add(selfDependency);
-
-      MavenProject executionProject = project.getExecutionProject();
-      List compileSourceRoots =
-        executionProject.getTestCompileSourceRoots();
-
-      if (testSourceRoots != null)
-      {
-        for (int i = 0; i < testSourceRoots.length; i++)
-        {
-          compileSourceRoots.add(testSourceRoots[i].getAbsolutePath());
-        }
-      }
-
-      List compileResourceRoots = executionProject.getTestResources();
-      if (testResourceRoots != null)
-      {
-        for (int i = 0; i < testResourceRoots.length; i++)
-        {
-          Resource resource = new Resource();
-          resource.setDirectory(testSourceRoots[i].getAbsolutePath());
-          compileResourceRoots.add(resource);
-        }
-      }
-
-      getLog().info("Generating JDeveloper " + release + " Project " +
-                    project.getArtifactId() + "-test");
-
-      // Note: all artifacts implicitly included in "test" scope
-      generateProject(projectFile, project.getArtifactId() + "-test",
-                      project.getPackaging(), testDependencies,
-                      project.getTestArtifacts(), compileSourceRoots,
-                      compileResourceRoots,
-                      Collections.singletonList(webappDir.getPath()),
-                      outputDir);
-    }
-  }
-
-  private void generateProject(File projectFile, String projectName,
-                               String packaging, List dependencies,
-                               List artifacts, List sourceRoots,
-                               List resourceRoots, List webSourceRoots,
-                               File outputDir)
-    throws IOException, MojoExecutionException
-  {
-    try
-    {
-      File projectDir = projectFile.getParentFile();
-      Xpp3Dom projectDOM = readProjectDOM(projectFile);
-      replaceWebappInfo(projectName, projectDOM);
-      replaceSourcePaths(projectDir, sourceRoots, resourceRoots,
-                         projectDOM);
-      //replaceResourcePaths(projectDir, resourceRoots, projectDOM);
-      replaceWebSourcePaths(projectDir, webSourceRoots, projectDOM);
-      replaceDependencies(projectDir, dependencies, projectDOM);
-      replaceLibraries(projectDir, artifacts, projectDOM);
-      replaceTagLibraries(projectDOM);
-      replaceOutputDirectory(projectDir, outputDir, projectDOM);
-      replaceParameters(projectName, projectDOM);
-      writeDOM(projectFile, projectDOM);
-
-      if ("war".equals(packaging))
-      {
-        copyTagLibraries(projectDir, dependencies, artifacts);
-      }
-    }
-    catch (XmlPullParserException e)
-    {
-      throw new MojoExecutionException("Error generating project", e);
-    }
-  }
-
-  private void replaceProjects(File workspaceDir, Xpp3Dom workspaceDOM)
-    throws XmlPullParserException
-  {
-    // /jws:workspace
-    //   /list[@n="listOfChildren"]
-    Xpp3Dom sourceDOM = workspaceDOM.getChild("list");
-
-    // <hash>
-    //   <value n="nodeClass" v="oracle.jdeveloper.model.JProject"/>
-    //   <url n="URL" path="[workspace-relative-path-to-project.jpr]"/>
-    // </hash>
-    Xpp3Dom targetDOM = new Xpp3Dom("list");
-
-    for (Iterator i = project.getCollectedProjects().iterator(); i.hasNext(); )
-    {
-      MavenProject collectedProject = (MavenProject) i.next();
-
-      // if a child project is also a workspace, then don't 
-      // put it in the .jws file.  It will have its own .jws
-      // file.
-      if (!"pom".equals(collectedProject.getPackaging()))
-      {
-        File projectFile = getJProjectFile(collectedProject);
-        
-        targetDOM.addChild(createProjectReferenceDOM(workspaceDir,
-                                                     projectFile));
-  
-        File testProjectFile = getJProjectTestFile(collectedProject);
-        targetDOM.addChild(createProjectReferenceDOM(workspaceDir,
-                                                     testProjectFile));
-      }
-    }
-
-    // TODO: use a better merge algorithm
-    removeChildren(sourceDOM);
-
-    // make sure to pass Boolean.FALSE to allow
-    // multiple child elements with the same name
-    Xpp3Dom.mergeXpp3Dom(sourceDOM, targetDOM, Boolean.FALSE);
-  }
-
-  private void replaceWebSourcePaths(File projectDir, List sourceRoots,
-                                     Xpp3Dom projectDOM)
-    throws XmlPullParserException
-  {
-    // /jpr:project
-    //   /hash[@n="oracle.jdeveloper.model.J2eeSettings"]
-    //     /hash[@n="webContentSet"]
-    //       /list[@n="url-path"]
-    Xpp3Dom pathsDOM =
-      findNamedChild(projectDOM, "hash", "oracle.jdeveloper.model.J2eeSettings");
-    Xpp3Dom contentSetDOM =
-      findNamedChild(pathsDOM, "hash", "webContentSet");
-    Xpp3Dom sourceDOM = findNamedChild(contentSetDOM, "list", "url-path");
-
-    //
-    // <url path="[relative-path-to-source-root]" />
-    //
-    Xpp3Dom targetDOM = new Xpp3Dom("list");
-    for (Iterator i = sourceRoots.iterator(); i.hasNext(); )
-    {
-      File sourceRoot = new File((String) i.next());
-      String relativeRoot = getRelativeDir(projectDir, sourceRoot);
-      Xpp3Dom urlDOM = new Xpp3Dom("url");
-      urlDOM.setAttribute("path", relativeRoot);
-      targetDOM.addChild(urlDOM);
-    }
-
-    // TODO: use a better merge algorithm
-    removeChildren(sourceDOM);
-
-    // make sure to pass Boolean.FALSE to allow
-    // multiple child elements with the same name
-    Xpp3Dom.mergeXpp3Dom(sourceDOM, targetDOM, Boolean.FALSE);
-  }
-
-  private void replaceWebappInfo(String projectName, Xpp3Dom projectDOM)
-    throws XmlPullParserException
-  {
-    // /jpr:project
-    //   /hash[@n="oracle.jdeveloper.model.J2eeSettings"]
-    //     /value[@n="j2eeWebAppName" v="maven-generated-webapp"]
-    //     /value[@n="j2eeWebContextRoot" v="maven-generated-context-root"]
-    Xpp3Dom settingsDOM =
-      findNamedChild(projectDOM, "hash", "oracle.jdeveloper.model.J2eeSettings");
-    Xpp3Dom webappNameDOM =
-      findNamedChild(settingsDOM, "value", "j2eeWebAppName");
-    Xpp3Dom webappContextDOM =
-      findNamedChild(settingsDOM, "value", "j2eeWebContextRoot");
-
-    // update the webapp name
-    webappNameDOM.setAttribute("v", projectName + "-webapp");
-
-    // update the webapp context root
-    webappContextDOM.setAttribute("v", projectName + "-context-root");
-  }
-
-  private void replaceSourcePaths(File projectDir, List sourceRoots,
-                                  List resourceRoots, Xpp3Dom projectDOM)
-    throws XmlPullParserException
-  {
-    // /jpr:project
-    //   /hash[@n="oracle.jdeveloper.model.PathsConfiguration"]
-    //     /hash[@n="javaContentSet"]
-    //       /list[@n="url-path"]
-    Xpp3Dom pathsDOM =
-      findNamedChild(projectDOM, "hash", "oracle.jdeveloper.model.PathsConfiguration");
-    Xpp3Dom contentSetDOM =
-      findNamedChild(pathsDOM, "hash", "javaContentSet");
-    Xpp3Dom sourceDOM = findNamedChild(contentSetDOM, "list", "constituent-sets");
-
-    //
-    // <url path="[relative-path-to-source-root]" />
-    //
-    Xpp3Dom targetDOM = new Xpp3Dom("list");
-
-    Collections.sort(sourceRoots);
-    for (Iterator i = sourceRoots.iterator(); i.hasNext(); )
-    {
-      File sourceRoot = new File((String) i.next());
-      Xpp3Dom hashDOM = new Xpp3Dom("hash");
-
-      Xpp3Dom listDOM = new Xpp3Dom("list");
-      listDOM.setAttribute("n", "pattern-filters");
-      hashDOM.addChild(listDOM);
-
-      Xpp3Dom stringDOM = new Xpp3Dom("string");
-      stringDOM.setAttribute("v", "+**");
-      listDOM.addChild(stringDOM);
-
-      listDOM = new Xpp3Dom("list");
-      listDOM.setAttribute("n", "url-path");
-      hashDOM.addChild(listDOM);
-
-      String relativeRoot = getRelativeDir(projectDir, sourceRoot);
-      Xpp3Dom urlDOM = new Xpp3Dom("url");
-      urlDOM.setAttribute("path", relativeRoot);
-      listDOM.addChild(urlDOM);
-
-      targetDOM.addChild(hashDOM);
-    }
-
-    // TODO: get bug fixed in 10.1.3 for copying resources
-    Collections.sort(resourceRoots, new Comparator()
-        {
-          public int compare(Object a, Object b)
-          {
-            Resource ra = (Resource) a;
-            Resource rb = (Resource) b;
-            return ra.getDirectory().compareTo(rb.getDirectory());
-          }
-
-        });
-
-    for (Iterator i = resourceRoots.iterator(); i.hasNext(); )
-    {
-      Resource resource = (Resource) i.next();
-      File resourceRoot = new File(resource.getDirectory());
-      String relativeRoot = getRelativeDir(projectDir, resourceRoot);
-
-      Xpp3Dom hashDOM = new Xpp3Dom("hash");
-
-      Xpp3Dom listDOM = new Xpp3Dom("list");
-      listDOM.setAttribute("n", "pattern-filters");
-      hashDOM.addChild(listDOM);
-
-      Xpp3Dom stringDOM = null;
-      // TODO: This is a Hack for excluding the golden files,
-      // which are not really xml files.  We need a way, in
-      // the pom file to specify excludes.
-      if (relativeRoot.startsWith("src/test/resources"))
-      {
-        stringDOM = new Xpp3Dom("string");
-        stringDOM.setAttribute("v",
-                            "-oracle/adfinternal/view/faces/renderkit/golden/");
-        listDOM.addChild(stringDOM);
-      }
-
-      stringDOM = new Xpp3Dom("string");
-      stringDOM.setAttribute("v", "+**");
-      listDOM.addChild(stringDOM);
-
-      listDOM = new Xpp3Dom("list");
-      listDOM.setAttribute("n", "url-path");
-      hashDOM.addChild(listDOM);
-
-      Xpp3Dom urlDOM = new Xpp3Dom("url");
-      urlDOM.setAttribute("path", relativeRoot);
-      listDOM.addChild(urlDOM);
-
-      targetDOM.addChild(hashDOM);
-    }
-
-    // TODO: use a better merge algorithm
-    removeChildren(sourceDOM);
-
-    // make sure to pass Boolean.FALSE to allow
-    // multiple child elements with the same name
-    Xpp3Dom.mergeXpp3Dom(sourceDOM, targetDOM, Boolean.FALSE);
-  }
-
-  private void replaceResourcePaths(File projectDir, List resourceRoots,
-                                    Xpp3Dom projectDOM)
-    throws XmlPullParserException
-  {
-    // /jpr:project
-    //   /hash[@n="oracle.ide.model.ResourcePaths"]
-    //     /hash[@n="resourcesContentSet"]
-    //       /list[@n="url-path"]
-
-    Xpp3Dom pathsDOM =
-      findNamedChild(projectDOM, "hash", "oracle.ide.model.ResourcePaths");
-    Xpp3Dom contentSetDOM =
-      findNamedChild(pathsDOM, "hash", "resourcesContentSet");
-    Xpp3Dom sourceDOM = findNamedChild(contentSetDOM, "list", "url-path");
-
-    //
-    // <url path="[relative-path-to-source-root]" />
-    //
-    Xpp3Dom targetDOM = new Xpp3Dom("list");
-    for (Iterator i = resourceRoots.iterator(); i.hasNext(); )
-    {
-      Resource resource = (Resource) i.next();
-      File resourceRoot = new File(resource.getDirectory());
-      String relativeRoot = getRelativeDir(projectDir, resourceRoot);
-      Xpp3Dom urlDOM = new Xpp3Dom("url");
-      urlDOM.setAttribute("path", relativeRoot);
-      targetDOM.addChild(urlDOM);
-    }
-
-    // TODO: use a better merge algorithm
-    removeChildren(sourceDOM);
-
-    // make sure to pass Boolean.FALSE to allow
-    // multiple child elements with the same name
-    Xpp3Dom.mergeXpp3Dom(sourceDOM, targetDOM, Boolean.FALSE);
-  }
-
-  private void replaceDependencies(File projectDir, List dependencies,
-                                   Xpp3Dom projectDOM)
-    throws XmlPullParserException
-  {
-    // /jpr:project
-    //   /hash[@n="oracle.ide.model.DependencyConfiguration"]
-    //     /list[@n="dependencyList"]
-    Xpp3Dom configDOM =
-      findNamedChild(projectDOM, "hash", "oracle.ide.model.DependencyConfiguration");
-    Xpp3Dom sourceDOM =
-      findNamedChild(configDOM, "list", "dependencyList");
-
-    Xpp3Dom targetDOM = new Xpp3Dom("list");
-    for (Iterator i = dependencies.iterator(); i.hasNext(); )
-    {
-      Dependency dependency = (Dependency) i.next();
-      MavenProject dependentProject =
-        findDependentProject(dependency.getManagementKey());
-      if (dependentProject != null)
-      {
-        File dependentProjectFile = getJProjectFile(dependentProject);
-        String relativePath =
-          getRelativeFile(projectDir, dependentProjectFile);
-
-        Xpp3Dom hashDOM = new Xpp3Dom("hash");
-        Xpp3Dom valueDOM = new Xpp3Dom("value");
-        valueDOM.setAttribute("n", "class");
-        valueDOM.setAttribute("v",
-                              "oracle.jdeveloper.library.ProjectLibrary");
-        Xpp3Dom srcOwnValDOM = new Xpp3Dom("value");
-        srcOwnValDOM.setAttribute("n", "sourceOwnerURL");
-        Xpp3Dom urlDOM = new Xpp3Dom("url");
-        urlDOM.setAttribute("n", "sourceURL");
-        urlDOM.setAttribute("path", relativePath);
-        hashDOM.addChild(valueDOM);
-        hashDOM.addChild(srcOwnValDOM);
-        hashDOM.addChild(urlDOM);
-        targetDOM.addChild(hashDOM);
-      }
-    }
-
-    // TODO: use a better merge algorithm
-    removeChildren(sourceDOM);
-
-    // make sure to pass Boolean.FALSE to allow
-    // multiple child elements with the same name
-    Xpp3Dom.mergeXpp3Dom(sourceDOM, targetDOM, Boolean.FALSE);
-  }
-
-  private void replaceLibraries(File projectDir, List artifacts,
-                                Xpp3Dom projectDOM)
-    throws XmlPullParserException
-  {
-    // /jpr:project
-    //   /hash[@n="oracle.jdevimpl.config.JProjectLibraries"]
-    //     /hash[@n="internalDefinitions"]
-    //       /list[@n="libraryDefinitions"]
-    Xpp3Dom projectLibsDOM =
-      findNamedChild(projectDOM, "hash", "oracle.jdevimpl.config.JProjectLibraries");
-    Xpp3Dom internalDefsDOM =
-      findNamedChild(projectLibsDOM, "hash", "internalDefinitions");
-    Xpp3Dom sourceDefsDOM =
-      findNamedChild(internalDefsDOM, "list", "libraryDefinitions");
-
-    // /jpr:project
-    //   /hash[@n="oracle.jdevimpl.config.JProjectLibraries"]
-    //     /list[@n="libraryReferences"]
-    Xpp3Dom sourceRefsDOM =
-      findNamedChild(projectLibsDOM, "list", "libraryReferences");
-
-    Xpp3Dom targetDefsDOM = new Xpp3Dom("list");
-    Xpp3Dom targetRefsDOM = new Xpp3Dom("list");
-
-    //
-    // libraryDefinitions
-    //
-    // <hash>
-    //   <list n="classPath">
-    //     <url path="[path-to-artifact]" jar-entry="" />
-    //   </list>
-    //   <value n="deployedByDefault" v="true"/>
-    //   <value n="description" v="[artifact.id]"/>
-    //   <value n="id" v="[artifact.id]"/>
-    // </hash>
-    //
-
-    // sort the artifacts
-    Collections.sort(artifacts, new Comparator()
-        {
-          public int compare(Object a, Object b)
-          {
-            Artifact arta = (Artifact) a;
-            Artifact artb = (Artifact) b;
-            return arta.getId().compareTo(artb.getId());
-          }
-
-        });
-
-    List libraryRefs = new LinkedList();
-    for (Iterator i = artifacts.iterator(); i.hasNext(); )
-    {
-      Artifact artifact = (Artifact) i.next();
-
-      if (!isDependentProject(artifact.getDependencyConflictId()))
-      {
-        String id = artifact.getId();
-        String path = getRelativeFile(projectDir, artifact.getFile());
-
-        // libraryDefinitions entry
-        Xpp3Dom hashDOM = new Xpp3Dom("hash");
-        Xpp3Dom listDOM = new Xpp3Dom("list");
-        listDOM.setAttribute("n", "classPath");
-
-        Xpp3Dom urlDOM = new Xpp3Dom("url");
-        urlDOM.setAttribute("path", path);
-        urlDOM.setAttribute("jar-entry", "");
-        listDOM.addChild(urlDOM);
-        hashDOM.addChild(listDOM);
-
-        Xpp3Dom valueDOM = new Xpp3Dom("value");
-        valueDOM.setAttribute("n", "deployedByDefault");
-        valueDOM.setAttribute("v", "true");
-        hashDOM.addChild(valueDOM);
-
-        valueDOM = new Xpp3Dom("value");
-        valueDOM.setAttribute("n", "description");
-        valueDOM.setAttribute("v", id);
-        hashDOM.addChild(valueDOM);
-
-        valueDOM = new Xpp3Dom("value");
-        valueDOM.setAttribute("n", "id");
-        valueDOM.setAttribute("v", id);
-        hashDOM.addChild(valueDOM);
-        targetDefsDOM.addChild(hashDOM);
-
-        libraryRefs.add(id);
-      }
-    }
-
-    // This boolean is set by specifying the jdev.plugin.add.libraries
-    // property at the top of a project's pom file.  There are projects
-    // that don't need these libraries in their .jpr files to compile and this
-    // property allows them to be excluded.
-    //
-    // IMPORTANT NOTE: if this property is set in a project,
-    // then libraries will NOT be added, even though they
-    // may be specified under the maven-jdev-plugin.
-    if (_addLibraries)
-    {
-      // Add libraries.  The default libraries can be
-      // overridden in the trunk/toplevel pom file.
-      if (_releaseMajor >= 11)
-      {
-        // Add the default libraries
-        libraryRefs.add(0,"JSF 1.2");
-        libraryRefs.add(0,"JSP Runtime");
-      }
-
-      // Add the libraries
-      if (libraries != null)
-      {
-        for (int i = 0; i < libraries.length; i++)
-        {
-          // Default libraries for release 11 were already
-          // added above.
-          if (   (_releaseMajor >= 11)
-              && (   ("JSF 1.2".equalsIgnoreCase(libraries[i]))
-                  || ("JSP Runtime".equalsIgnoreCase(libraries[i]))
-                 )
-             )
-          {
-            continue;
-          }
-          // Add the library
-          libraryRefs.add(0, libraries[i]);
-        }
-      }
-    }
-
-    //
-    // libraryReferences
-    //
-    // <hash>
-    //   <value n="id" v="[artifact.id]"/>
-    //   <value n="isJDK" v="false"/>
-    // </hash>
-    //
-    Collections.sort(libraryRefs);
-
-    for (Iterator i = libraryRefs.iterator(); i.hasNext(); )
-    {
-      String id = (String) i.next();
-
-      // libraryReferences entry
-      Xpp3Dom hashDOM = new Xpp3Dom("hash");
-      Xpp3Dom valueDOM = new Xpp3Dom("value");
-      valueDOM.setAttribute("n", "id");
-      valueDOM.setAttribute("v", id);
-      hashDOM.addChild(valueDOM);
-
-      valueDOM = new Xpp3Dom("value");
-      valueDOM.setAttribute("n", "isJDK");
-      valueDOM.setAttribute("v", "false");
-      hashDOM.addChild(valueDOM);
-      targetRefsDOM.addChild(hashDOM);
-    }
-
-    // First, add JSP Runtime dependency if src/main/webapp exists
-    // TODO: use a better merge algorithm
-    removeChildren(sourceDefsDOM);
-    removeChildren(sourceRefsDOM);
-
-    // make sure to pass Boolean.FALSE to allow
-    // multiple child elements with the same name
-    Xpp3Dom.mergeXpp3Dom(sourceDefsDOM, targetDefsDOM, Boolean.FALSE);
-    Xpp3Dom.mergeXpp3Dom(sourceRefsDOM, targetRefsDOM, Boolean.FALSE);
-  }
-
-  private void replaceLocalTagLibraries(Xpp3Dom targetLibsDOM)
-    throws XmlPullParserException
-  {
-    TldContentHandler tldHandler = new TldContentHandler();
-    String path = null;
-
-    // Loop through all the .tld files in the WEB-INF dir
-    // Parse each and get the values needed for the TagLibraries
-    // hash in the .jpr file.
-    try
-    {
-      File webInfDir =
-        new File(project.getBasedir(), "src/main/webapp/WEB-INF");
-      if (webInfDir == null)
-      {
-        return;
-      }
-
-      File[] files = webInfDir.listFiles();
-      if (files == null)
-      {
-        return;
-      }
-
-      Xpp3Dom hashDOM = null;
-      Xpp3Dom valueDOM = null;
-      for (int i = 0; i < files.length; i++)
-      {
-        path = files[i].getPath();
-        if (path.endsWith(".tld"))
-        {
-          hashDOM = new Xpp3Dom("hash");
-          // we have a tag library.  Parse it and
-          // get the values needed for the .jpr file
-
-          // Parse
-          tldHandler.parseTld(files[i]);
-          // call gettors to get the values
-          valueDOM = new Xpp3Dom("value");
-          valueDOM.setAttribute("n", "jspVersion");
-          valueDOM.setAttribute("v", tldHandler.getJspVersion());
-          hashDOM.addChild(valueDOM);
-
-          valueDOM = new Xpp3Dom("value");
-          valueDOM.setAttribute("n", "name");
-          valueDOM.setAttribute("v", tldHandler.getName());
-          hashDOM.addChild(valueDOM);
-
-          valueDOM = new Xpp3Dom("value");
-          valueDOM.setAttribute("n", "prefix");
-          valueDOM.setAttribute("v", tldHandler.getPrefix());
-          hashDOM.addChild(valueDOM);
-
-          valueDOM = new Xpp3Dom("value");
-          valueDOM.setAttribute("n", "tldURL");
-          valueDOM.setAttribute("v",
-            "WEB-INF/" + path.substring(path.indexOf("WEB-INF") +  8));
-          hashDOM.addChild(valueDOM);
-
-          valueDOM = new Xpp3Dom("value");
-          valueDOM.setAttribute("n", "URI");
-          valueDOM.setAttribute("v", tldHandler.getURI());
-          hashDOM.addChild(valueDOM);
-
-          valueDOM = new Xpp3Dom("value");
-          valueDOM.setAttribute("n", "version");
-          valueDOM.setAttribute("v", tldHandler.getVersion());
-          hashDOM.addChild(valueDOM);
-
-          // Add each file's hash to the tag-libraries "list"
-          targetLibsDOM.addChild(hashDOM);
-        } // endif
-      } // endfor
-      return;
-    }
-    catch (SAXException saxex)
-    {
-      getLog().info("SAX Parse Exception parsing " + path + ": " +
-                    saxex.getMessage(), saxex);
-    }
-    catch (IOException ioe)
-    {
-      getLog().info("Unable to open an InputStream to " + path, ioe);
-    }
-    catch (ParserConfigurationException pce)
-    {
-      getLog().info("Unable to create SAX parser for " + path, pce);
-    }
-  }
-
-
-  private void replaceTagLibraries(Xpp3Dom projectDOM)
-    throws XmlPullParserException
-  {
-    // This boolean is set by specifying the jdev.plugin.add.taglibs
-    // property at the top of a project's pom file.  There are projects
-    // that don't need taglibs in their .jpr files to compile and this
-    // allows them to be excluded.
-    if (!_addTagLibs)
-    {
-      return;
-    }
-
-    // /jpr:project
-    //   /hash[@n="oracle.jdevimpl.webapp.jsp.libraries.model.ProjectTagLibraries"]
-    //       /list[@n="tag-libaries"]
-    Xpp3Dom projectTagsDOM =
-      findNamedChild(projectDOM, "hash", "oracle.jdevimpl.webapp.jsp.libraries.model.ProjectTagLibraries");
-    Xpp3Dom tagLibsDOM =
-      findNamedChild(projectTagsDOM, "list", "tag-libraries");
-
-    Xpp3Dom targetLibsDOM = new Xpp3Dom("list");
-
-    //
-    // tagLibraryDefinitions
-    //
-    //<hash>
-    //  <hash n="baseLibrary">
-    //    <value n="name" v="JSF HTML"></value>
-    //    <value n="version" v="1.2"></value>
-    //  </hash>
-    //  <value n="jspVersion" v="2.1"></value>
-    //  <value n="name" v="JSF HTML"></value>
-    //
-    //  <value n="tldURL" v="@oracle.home@lib/java/shared/oracle.jsf/1.2/jsf-ri.jar!/META-INF/html_basic.tld"></value>
-    //  <value n="URI" v="http://java.sun.com/jsf/html"></value>
-    //  <value n="version" v="1.2"></value>
-    //</hash>
-    //
-
-    // Parent "hash"
-    Xpp3Dom hashDOM = null;
-
-    // <value...
-    Xpp3Dom valueDOM = null;
-
-    if (distributedTagLibraries != null &&
-        distributedTagLibraries.length > 0)
-    {
-      // Process each distributed Tag Library
-      for (int i = 0; i < distributedTagLibraries.length; i++)
-      {
-        Properties disTagLib = distributedTagLibraries[i];
-        String nameName = null;
-        String nameValue = null;
-        String versionName = null;
-        String versionValue = null;
-
-        // Create parent hash for each taglib
-        hashDOM = new Xpp3Dom("hash");
-
-        // baseLibrary "hash" for each taglib
-        Xpp3Dom hashBaseDOM = new Xpp3Dom("hash");
-        hashBaseDOM.setAttribute("n", "baseLibrary");
-        // Add baseLibrary hash to parent hash
-        hashDOM.addChild(hashBaseDOM);
-
-        // Process each property of the taglib
-        for (Enumeration keys = disTagLib.propertyNames();
-             keys.hasMoreElements(); )
-        {
-          // Get the name value pair
-          String name = (String) keys.nextElement();
-          String value = (String) disTagLib.get(name);
-
-          // Put the name and version values
-          // inside the baseLibrary hash.
-          // This only happens once per taglib
-          if ("name".equals(name))
-          {
-            nameName = name;
-            nameValue = value;
-
-            // n="name, v=<name of taglib> in baseLibrary
-            valueDOM = new Xpp3Dom("value");
-            valueDOM.setAttribute("n", name);
-            valueDOM.setAttribute("v", value);
-            hashBaseDOM.addChild(valueDOM);
-
-            // Duplicate the "name"  <value...
-            // outside of the baseLibrary
-            // n="name, v=<name of taglib> in parent hash
-            valueDOM = new Xpp3Dom("value");
-            valueDOM.setAttribute("n", nameName);
-            valueDOM.setAttribute("v", nameValue);
-            hashDOM.addChild(valueDOM);
-          }
-          else if ("version".equals(name))
-          {
-            versionName = name;
-            versionValue = value;
-
-            // n="version" v=<taglib version> in baseLibrary
-            valueDOM = new Xpp3Dom("value");
-            valueDOM.setAttribute("n", name);
-            valueDOM.setAttribute("v", value);
-            hashBaseDOM.addChild(valueDOM);
-
-            // Duplicate the "version" <value...
-            // outside of the baseLibrary
-            // n="version" v=<taglib version> in parent hash
-            valueDOM = new Xpp3Dom("value");
-            valueDOM.setAttribute("n", versionName);
-            valueDOM.setAttribute("v", versionValue);
-            hashDOM.addChild(valueDOM);
-          }
-          else
-          {
-            if ("tld".equals(name))
-            {
-              // Did not want to have a URL in the pom file.
-              // I just wanted the user to specify the name
-              // of the tld file.  So we fix it for JDev
-              // here.
-              name += "URL";
-              value = tagLibDirectory + "/" + value;
-            }
-            valueDOM = new Xpp3Dom("value");
-            valueDOM.setAttribute("n", name);
-            valueDOM.setAttribute("v", value);
-            hashDOM.addChild(valueDOM);
-          }
-        } //endfor processing each property
-
-        // We are done with this disTagLib
-        // Add it to the targetLibsDOM
-        if (hashDOM != null)
-        {
-          targetLibsDOM.addChild(hashDOM);
-        }
-      } // endfor processing each distributed tag lib
-    } //endif
-    else
-    {
-      // Use Default tag library configuration.  See comment before
-      // replaceTagLibraries.
-      replaceDefaultTagLibraries(projectDOM, targetLibsDOM);
-    }
-
-    replaceLocalTagLibraries(targetLibsDOM);
-
-    // First, add JSP Runtime dependency if src/main/webapp exists
-    // TODO: use a better merge algorithm
-    removeChildren(tagLibsDOM);
-
-    // make sure to pass Boolean.FALSE to allow
-    // multiple child elements with the same name
-    Xpp3Dom.mergeXpp3Dom(tagLibsDOM, targetLibsDOM, Boolean.FALSE);
-  }
-
-  private void replaceDefaultTagLibraries(Xpp3Dom projectDOM,
-                                          Xpp3Dom targetLibsDOM)
-    throws XmlPullParserException
-  {
-    // Begin JSF HTML Tag lib
-    Xpp3Dom hashDOM     = new Xpp3Dom("hash");
-    Xpp3Dom hashBaseDOM = new Xpp3Dom("hash");
-    Xpp3Dom valueDOM    = null;
-
-    hashBaseDOM.setAttribute("n", "baseLibrary");
-
-    // Add baseLibrary hash to parent hash
-    hashDOM.addChild(hashBaseDOM);
-
-    // Create parent hash for each taglib
-    //        hashDOM = new Xpp3Dom("hash");
-
-    // baseLibrary "hash" for each taglib
-    // Xpp3Dom hashBaseDOM = new Xpp3Dom("hash");
-    //        hashBaseDOM.setAttribute("n", "baseLibrary");
-
-    // n="name, v=<name of taglib> in baseLibrary
-    valueDOM = new Xpp3Dom("value");
-    valueDOM.setAttribute("n", "name");
-    valueDOM.setAttribute("v", "JSF HTML");
-    hashBaseDOM.addChild(valueDOM);
-
-    // Duplicate the "name"  <value...
-    // outside of the baseLibrary
-    // n="name, v=<name of taglib> in parent hash
-    valueDOM = new Xpp3Dom("value");
-    valueDOM.setAttribute("n", "name");
-    valueDOM.setAttribute("v", "JSF HTML");
-    hashDOM.addChild(valueDOM);
-
-    // n="version" v=<taglib version> in baseLibrary
-    valueDOM = new Xpp3Dom("value");
-    valueDOM.setAttribute("n", "version");
-    valueDOM.setAttribute("v", "1.2");
-    hashBaseDOM.addChild(valueDOM);
-
-    // Duplicate the "version" <value...
-    // outside of the baseLibrary
-    // n="name, v=<name of taglib> in parent hash
-    valueDOM = new Xpp3Dom("value");
-    valueDOM.setAttribute("n", "version");
-    valueDOM.setAttribute("v", "1.2");
-    hashDOM.addChild(valueDOM);
-
-    valueDOM = new Xpp3Dom("value");
-    valueDOM.setAttribute("n", "jspVersion");
-    valueDOM.setAttribute("v", "2.1");
-    hashDOM.addChild(valueDOM);
-
-    valueDOM = new Xpp3Dom("value");
-    valueDOM.setAttribute("n", "tldURL");
-    valueDOM.setAttribute("v", tagLibDirectory + "/html_basic.tld");
-    hashDOM.addChild(valueDOM);
-
-    valueDOM = new Xpp3Dom("value");
-    valueDOM.setAttribute("n", "URI");
-    valueDOM.setAttribute("v", "http://java.sun.com/jsf/html");
-    hashDOM.addChild(valueDOM);
-
-    // We are done with this disTagLib
-    // Add it to the targetLibsDOM
-    if (hashDOM != null)
-    {
-      targetLibsDOM.addChild(hashDOM);
-    }
-
-    // Begin JSF Core Taglib
-    hashDOM     = new Xpp3Dom("hash");
-    hashBaseDOM = new Xpp3Dom("hash");
-
-    hashBaseDOM.setAttribute("n", "baseLibrary");
-
-    // Add baseLibrary hash to parent hash
-    hashDOM.addChild(hashBaseDOM);
-
-    // n="name, v=<name of taglib> in baseLibrary
-    valueDOM = new Xpp3Dom("value");
-    valueDOM.setAttribute("n", "name");
-    valueDOM.setAttribute("v", "JSF Core");
-    hashBaseDOM.addChild(valueDOM);
-
-    // Duplicate the "name"  <value...
-    // outside of the baseLibrary
-    // n="name, v=<name of taglib> in parent hash
-    valueDOM = new Xpp3Dom("value");
-    valueDOM.setAttribute("n", "name");
-    valueDOM.setAttribute("v", "JSF Core");
-    hashDOM.addChild(valueDOM);
-
-    // n="version" v=<taglib version> in baseLibrary
-    valueDOM = new Xpp3Dom("value");
-    valueDOM.setAttribute("n", "version");
-    valueDOM.setAttribute("v", "1.2");
-    hashBaseDOM.addChild(valueDOM);
-
-    // Duplicate the "version" <value...
-    // outside of the baseLibrary
-    // n="name, v=<name of taglib> in parent hash
-    valueDOM = new Xpp3Dom("value");
-    valueDOM.setAttribute("n", "version");
-    valueDOM.setAttribute("v", "1.2");
-    hashDOM.addChild(valueDOM);
-
-    valueDOM = new Xpp3Dom("value");
-    valueDOM.setAttribute("n", "jspVersion");
-    valueDOM.setAttribute("v", "2.1");
-    hashDOM.addChild(valueDOM);
-
-    valueDOM = new Xpp3Dom("value");
-    valueDOM.setAttribute("n", "tldURL");
-    valueDOM.setAttribute("v", tagLibDirectory + "/jsf_core.tld");
-    hashDOM.addChild(valueDOM);
-
-    valueDOM = new Xpp3Dom("value");
-    valueDOM.setAttribute("n", "URI");
-    valueDOM.setAttribute("v", "http://java.sun.com/jsf/core");
-    hashDOM.addChild(valueDOM);
-
-    // We are done with this disTagLib
-    // Add it to the targetLibsDOM
-    if (hashDOM != null)
-    {
-      targetLibsDOM.addChild(hashDOM);
-    }
-  }
-
-  private void replaceParameters(String projectName, Xpp3Dom projectDOM)
-    throws XmlPullParserException
-  {
-    if ((_releaseMajor >= 11) && (projectName != null))
-    {
-      replaceCompiler(projectDOM);
-      replaceMakeProjectAndRunTarget(projectDOM);
-    }
-  }
-  private void replaceCompiler(Xpp3Dom projectDOM)
-    throws XmlPullParserException
-  {
-    // /jpr:project
-    // <hash n="oracle.jdeveloper.compiler.OjcConfiguration">
-    //   <value n="assertionsEnabled" v="true"/>
-    //   <value n="compiler.name" v="Ojc"/>
-    //   <list n="copyRes">
-    //      <string v=".java"/>
-    Xpp3Dom configDOM =
-      findNamedChild(projectDOM, "hash",
-                     "oracle.jdeveloper.compiler.OjcConfiguration");
-    Xpp3Dom compilerDOM = findNamedChild(configDOM, "value", "compiler.name");
-    String compilerValue = "Ojc";
-
-    if (   (compiler != null)
-        && "Javac".equalsIgnoreCase(compiler)
-       )
-    {
-      compilerValue = "Javac";
-    }
-    compilerDOM.setAttribute("v", compilerValue);
-
-    return;
-  }
-
-  private void replaceMakeProjectAndRunTarget(Xpp3Dom projectDOM)
-    throws XmlPullParserException
-  {
-    // /jpr:project
-    //   /hash[@n="oracle.jdeveloper.runner.RunConfigurations"]
-    //     /hash[@n="runConfigurationDefinitions"]
-    //       /hash[@n="Default"]
-    //         /value[@n="makeProject" v="false"]
-    //         /url[@n="targetURL" path="src/main/webapp/index.jspx"]
-    Xpp3Dom configDOM =
-      findNamedChild(projectDOM, "hash",
-                     "oracle.jdeveloper.runner.RunConfigurations");
-    Xpp3Dom defsDOM =
-      findNamedChild(configDOM, "hash", "runConfigurationDefinitions");
-    Xpp3Dom defaultDOM = findNamedChild(defsDOM, "hash", "Default");
-    Xpp3Dom makeProjectDom =
-      findNamedChild(defaultDOM, "value", "compileBeforeRun");
-
-    if (makeProject)
-    {
-      makeProjectDom.setAttribute("v", "true");
-    }
-    else
-    {
-      makeProjectDom.setAttribute("v", "false");
-    }
-
-    if ((runTarget != null) && !"".equals(runTarget))
-    {
-      // Convert file separator chars to generic
-      String targetURL = "";
-      if (File.separatorChar == '/')
-      {
-        targetURL = runTarget.replace('\\', '/'); // Unix
-      }
-      else
-      {
-        targetURL = runTarget.replace('/', '\\'); // Windows
-      }
-
-      Xpp3Dom targetDOM = new Xpp3Dom("url");
-      targetDOM.setAttribute("path", targetURL);
-      targetDOM.setAttribute("n", "targetURL");
-      defaultDOM.addChild(targetDOM);
-    }
-
-    return;
-  }
-
-  private void copyTagLibraries(File projectDir, List dependencies,
-                                List artifacts)
-    throws IOException
-  {
-    File targetDir = new File(projectDir, "src/main/webapp/WEB-INF");
-
-    for (Iterator i = dependencies.iterator(); i.hasNext(); )
-    {
-      Dependency dependency = (Dependency) i.next();
-      MavenProject dependentProject =
-        findDependentProject(dependency.getManagementKey());
-      if (dependentProject != null)
-      {
-        List resourceRoots = dependentProject.getResources();
-        for (Iterator j = resourceRoots.iterator(); j.hasNext(); )
-        {
-          Resource resource = (Resource) j.next();
-          String resourceRoot = resource.getDirectory();
-          File resourceDirectory = new File(resourceRoot);
-          if (resourceDirectory.exists())
-          {
-            DirectoryScanner scanner = new DirectoryScanner();
-            scanner.setBasedir(resourceRoot);
-            scanner.addDefaultExcludes();
-            scanner.setIncludes(new String[]
-                { "META-INF/*.tld" });
-            scanner.scan();
-
-            String[] tldFiles = scanner.getIncludedFiles();
-            for (int k = 0; k < tldFiles.length; k++)
-            {
-              File sourceFile = new File(resourceDirectory, tldFiles[k]);
-              File targetFile = new File(targetDir, sourceFile.getName());
-
-              if (targetFile.exists())
-              {
-                targetFile.delete();
-              }
-              FileUtils.copyFile(sourceFile, targetFile);
-            }
-          }
-        }
-      }
-    }
-
-
-    Map sourceMap = new TreeMap();
-
-    for (Iterator i = artifacts.iterator(); i.hasNext(); )
-    {
-      Artifact artifact = (Artifact) i.next();
-      if (!isDependentProject(artifact.getDependencyConflictId()) &&
-          "jar".equals(artifact.getType()))
-      {
-        File file = artifact.getFile();
-        JarFile jarFile = new JarFile(file);
-        Enumeration jarEntries = jarFile.entries();
-        while (jarEntries.hasMoreElements())
-        {
-          JarEntry jarEntry = (JarEntry) jarEntries.nextElement();
-          String name = jarEntry.getName();
-          if (name.startsWith("META-INF/") && name.endsWith(".tld"))
-          {
-            List taglibs = (List) sourceMap.get(name);
-            if (taglibs == null)
-            {
-              taglibs = new ArrayList();
-              sourceMap.put(name, taglibs);
-            }
-
-            taglibs.add(file);
-          }
-        }
-      }
-    }
-
-    for (Iterator i = sourceMap.entrySet().iterator(); i.hasNext(); )
-    {
-      Map.Entry e = (Map.Entry) i.next();
-      List taglibs = (List) e.getValue();
-      String name = (String) e.getKey();
-
-      for (Iterator ti = taglibs.iterator(); ti.hasNext(); )
-      {
-        File file = (File) ti.next();
-        File sourceFile = new File(name);
-        StringBuffer buff = new StringBuffer(sourceFile.getName());
-        if (taglibs.size() > 1)
-        {
-          String jarName =
-            file.getName().substring(0, file.getName().length() -
-                                     ".jar".length());
-          buff.insert(buff.length() - ".tld".length(), "-" + jarName);
-        }
-
-        URL jarURL = file.toURL();
-        URL sourceURL =
-          new URL("jar:" + jarURL.toExternalForm() + "!/" + name);
-        File targetFile = new File(targetDir, buff.toString());
-        if (targetFile.exists())
-        {
-          targetFile.delete();
-        }
-        FileUtils.copyURLToFile(sourceURL, targetFile);
-        targetFile.setReadOnly();
-      }
-    }
-  }
-
-  private void replaceOutputDirectory(File projectDir, File outputDir,
-                                      Xpp3Dom projectDOM)
-    throws XmlPullParserException
-  {
-    // /jpr:project
-    //   /hash[@n="oracle.jdevimpl.config.JProjectPaths"]
-
-    Xpp3Dom projectPathsDOM =
-      findNamedChild(projectDOM, "hash", "oracle.jdevimpl.config.JProjectPaths");
-    Xpp3Dom sourceDOM = new Xpp3Dom("url");
-
-    //
-    // <url @n="outputDirectory" path="[relative-path-to-output-dir]" />
-    //
-    sourceDOM.setAttribute("path", getRelativeDir(projectDir, outputDir));
-    sourceDOM.setAttribute("n", "outputDirectory");
-    projectPathsDOM.addChild(sourceDOM);
-  }
-
-  /**
-   * Returns the JDeveloper project file for a Maven POM.
-   *
-   * @param project  the Maven POM
-   *
-   * @return  the JDeveloper project file
-   */
-  private File getJProjectFile(MavenProject project)
-  {
-    String jprName = project.getArtifactId() + ".jpr";
-    return new File(project.getBasedir(), jprName);
-  }
-
-  /**
-   * Returns the JDeveloper test project file for a Maven POM.
-   *
-   * @param project  the Maven POM
-   *
-   * @return  the JDeveloper test project file
-   */
-  private File getJProjectTestFile(MavenProject project)
-  {
-    String jprName = project.getArtifactId() + "-test.jpr";
-    return new File(project.getBasedir(), jprName);
-  }
-
-  /**
-   * Returns the JDeveloper workspace file for a Maven POM.
-   *
-   * @param project  the Maven POM
-   *
-   * @return  the JDeveloper workspace file
-   */
-  private File getJWorkspaceFile(MavenProject project)
-  {
-    String jwsName = project.getArtifactId() + ".jws";
-    return new File(project.getBasedir(), jwsName);
-  }
-
-  /**
-   * Reads a JDeveloper workspace file into DOM.
-   *
-   * @param workspaceFile  the JDeveloper workspace file
-   *
-   * @return the parsed DOM
-   */
-  private Xpp3Dom readWorkspaceDOM(File workspaceFile)
-    throws IOException, XmlPullParserException
-  {
-    return readDOM(workspaceFile, release + "/workspace.xml");
-  }
-
-  /**
-   * Reads a JDeveloper project file into DOM.
-   *
-   * @param projectFile  the JDeveloper project file
-   *
-   * @return the parsed DOM
-   */
-  private Xpp3Dom readProjectDOM(File projectFile)
-    throws IOException, XmlPullParserException
-  {
-    return readDOM(projectFile, release + "/project.xml");
-  }
-
-  /**
-   * Reads a source file into DOM, defaulting to a packaged resource if
-   * the source file does not already exist.
-   *
-   * @param sourceFile    the source file to be parsed
-   * @param resourcePath  the default packaged resource
-   *
-   * @return the parsed DOM
-   */
-  private Xpp3Dom readDOM(File sourceFile, String resourcePath)
-    throws IOException, XmlPullParserException
-  {
-    Reader reader = null;
-    try
-    {
-      if (!force && sourceFile.exists())
-      {
-        // parse the existing source file
-        reader = new FileReader(sourceFile);
-      }
-      else
-      {
-        // parse the default resource file
-        URL resource = getClass().getResource(resourcePath);
-
-        // ensure that the resourcePath can be found
-        if (resource == null)
-        {
-          throw new IOException("Unable to read resource: " +
-                                resourcePath);
-        }
-
-        reader = new InputStreamReader(resource.openStream());
-      }
-      return Xpp3DomBuilder.build(reader);
-    }
-    finally
-    {
-      IOUtil.close(reader);
-    }
-  }
-
-  /**
-   * Writes a XML DOM to the target file.
-   *
-   * @param targetFile  the target file
-   * @param sourceDOM   the source DOM
-   */
-  private void writeDOM(File targetFile, Xpp3Dom sourceDOM)
-    throws IOException, XmlPullParserException
-  {
-    FileWriter writer = null;
-    try
-    {
-      writer = new FileWriter(targetFile);
-      Xpp3DomWriter.write(writer, sourceDOM);
-    }
-    finally
-    {
-      IOUtil.close(writer);
-    }
-  }
-
-  private String getRelativeDir(File source, File target)
-  {
-    return getRelativePath(source, target, true);
-  }
-
-  private String getRelativeFile(File source, File target)
-  {
-    return getRelativePath(source, target, false);
-  }
-
-  /**
-   * Returns the relative path between two files.
-   *
-   * @param source  the source file
-   * @param target  the target file
-   *
-   * @return  the relative path between two files
-   */
-  private String getRelativePath(File source, File target,
-                                 boolean isDirectory)
-  {
-    String sourcePath = source.getAbsolutePath();
-    String targetPath = target.getAbsolutePath();
-
-    if (targetPath.startsWith(sourcePath + File.separatorChar))
-    {
-      String relativePath = targetPath.substring(sourcePath.length() + 1);
-      relativePath = relativePath.replace(File.separatorChar, '/');
-      if (isDirectory)
-      {
-        relativePath += "/";
-      }
-      return relativePath;
-    }
-    else
-    {
-      String[] sourcePaths = sourcePath.split("\\" + File.separator);
-      String[] targetPaths = targetPath.split("\\" + File.separator);
-
-      // On Windows, the first element in the absolute path is a drive letter
-      if (System.getProperty("os.name").startsWith("Windows"))
-      {
-        // uppercase the drive letter because Cygwin sometimes delivers
-        // a lowercase drive letter
-        sourcePaths[0] = sourcePaths[0].toUpperCase();
-        targetPaths[0] = targetPaths[0].toUpperCase();
-      }
-
-      int sourcePathCount = sourcePaths.length;
-      int targetPathCount = targetPaths.length;
-      int commonPathCount = 0;
-
-      int minPathCount = Math.min(sourcePathCount, targetPathCount);
-      for (int i = 0; i < minPathCount; i++)
-      {
-        if (sourcePaths[i].equals(targetPaths[i]))
-        {
-          commonPathCount++;
-        }
-      }
-
-      if (commonPathCount > 0)
-      {
-        int sourceRelativePathCount = sourcePathCount - commonPathCount;
-        int targetRelativePathCount = targetPathCount - commonPathCount;
-
-        int relativePathCount =
-          sourceRelativePathCount + targetRelativePathCount;
-        String[] relativePaths = new String[relativePathCount];
-
-        for (int i = 0; i < sourceRelativePathCount; i++)
-        {
-          relativePaths[i] = "..";
-        }
-
-        for (int i = 0; i < targetRelativePathCount; i++)
-        {
-          relativePaths[sourceRelativePathCount + i] =
-              targetPaths[commonPathCount + i];
-        }
-
-        // join
-        StringBuffer relativePath = new StringBuffer();
-        for (int i = 0; i < relativePathCount; i++)
-        {
-          if (i > 0)
-          {
-            relativePath.append("/");
-          }
-          relativePath.append(relativePaths[i]);
-        }
-        return relativePath.toString();
-      }
-      else
-      {
-        return targetPath;
-      }
-    }
-  }
-
-  private Xpp3Dom findNamedChild(Xpp3Dom parent, String childName,
-                                 String attrValue)
-  {
-    Xpp3Dom[] hash = parent.getChildren(childName);
-    for (int i = 0; i < hash.length; i++)
-    {
-      if (attrValue.equals(hash[i].getAttribute("n")))
-      {
-        return hash[i];
-      }
-    }
-
-    Xpp3Dom child = new Xpp3Dom(childName);
-    child.setAttribute("n", attrValue);
-    parent.addChild(child);
-
-    return child;
-  }
-
-  private MavenProject findDependentProject(String dependencyManagementKey)
-  {
-    for (Iterator i = reactorProjects.iterator(); i.hasNext(); )
-    {
-      MavenProject reactorProject = (MavenProject) i.next();
-      String ident =
-        reactorProject.getArtifact().getDependencyConflictId();
-      if (ident.equals(dependencyManagementKey))
-      {
-        return reactorProject.getExecutionProject();
-      }
-    }
-
-    return null;
-  }
-
-  private boolean isDependentProject(String dependencyManagementKey)
-  {
-    return (findDependentProject(dependencyManagementKey) != null);
-  }
-
-  private void removeChildren(Xpp3Dom parent)
-  {
-    while (parent.getChildCount() != 0)
-    {
-      parent.removeChild(0);
-    }
-  }
-
-  private Xpp3Dom createProjectReferenceDOM(File workspaceDir,
-                                            File projectFile)
-  {
-    Xpp3Dom hashDOM = new Xpp3Dom("hash");
-    Xpp3Dom urlDOM = new Xpp3Dom("url");
-    urlDOM.setAttribute("n", "URL");
-    urlDOM.setAttribute("path", getRelativeFile(workspaceDir, projectFile));
-    
-    if (_releaseMajor < 11)
-    {
-      Xpp3Dom valueDOM = new Xpp3Dom("value");
-      valueDOM.setAttribute("n", "nodeClass");
-      valueDOM.setAttribute("v", "oracle.jdeveloper.model.JProject");
-      hashDOM.addChild(valueDOM);
-    }
-    hashDOM.addChild(urlDOM);
-    return hashDOM;
-  }
-
-  private void _parseRelease()
-  {
-    String nums[] = release.split("\\.");
-    try
-    {
-      _releaseMajor = Integer.parseInt(nums[0]);
-    }
-    catch (NumberFormatException e)
-    {
-      // Default release is currently 10.x
-      _releaseMajor = 10;
-    }
-  }
-
-  private int     _releaseMajor = 0;
-  private boolean _addLibraries = true;
-  private boolean _addTagLibs   = true;
-
-  private static final String _PROPERTY_ADD_LIBRARY = "jdev.plugin.add.libraries";
-  private static final String _PROPERTY_ADD_TAGLIBS = "jdev.plugin.add.taglibs";
-
-}
diff --git a/maven2-plugins/myfaces-jdev-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/TldContentHandler.java b/maven2-plugins/myfaces-jdev-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/TldContentHandler.java
deleted file mode 100644
index 1744987..0000000
--- a/maven2-plugins/myfaces-jdev-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/TldContentHandler.java
+++ /dev/null
@@ -1,187 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.jdeveloper;
-
-import java.io.File;
-import java.io.IOException;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.w3c.dom.Document;
-
-import org.w3c.dom.Node;
-
-import org.w3c.dom.NodeList;
-
-import org.xml.sax.SAXException;
-
-public class TldContentHandler
-{
-  /**
-    * Content Handler.
-    */
-  public TldContentHandler()
-  {
-  }
-  
-  /**
-    * Parse the .tld file to get the information 
-    * needed for the .jpr
-    */
-  public void parseTld(File file)
-  throws SAXException,
-         IOException,
-         ParserConfigurationException
-  {
-    // Create a builder factory
-    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-    factory.setValidating(false);
-    
-    // Create the Builder and parse the file
-    Document document = factory.newDocumentBuilder().parse(file);
-    
-    _processTldNodes(document);
-  }
-
-  /*=========================================================================
-   * Gettors and settors
-   * ======================================================================*/
-
-  public void setVersion(String version)
-  {
-    _version = version;
-  }
-
-  public void setName(String name)
-  {
-    _name = name;
-  }
-
-  public void setPrefix(String prefix)
-  {
-    _prefix = prefix;
-  }
-
-  public void setURI(String uri)
-  {
-    _uri = uri;
-  }
-
-  public void setJspVersion(String jspVersion)
-  {
-    _jspVersion = jspVersion;
-  }
-
-  public String getVersion()
-  {
-    return _version == null? "" : _version;
-  }
-
-  public String getName()
-  {
-    return _name == null? "" : _name;
-  }
-
-  public String getPrefix()
-  {
-    return _prefix == null? "" : _prefix;
-  }
-
-  public String getURI()
-  {
-    return _uri == null? "" : _uri;
-  }
-
-  public String getJspVersion()
-  {
-    return _jspVersion == null? "" : _jspVersion;
-  }
-
-
-  /**
-    * Find all the TLD nodes we want, get each node's value
-    * and set the value on the proper class property.
-    * 
-    * @param document  - DOM Document from the TLD file
-    */  
-  private void _processTldNodes(Document document)
-  {
-    Node node = null;
-    
-    // Get the Nodes first node.  We can be specific here
-    // because we know we want the first node.
-    NodeList nodeList = document.getElementsByTagName(_TLIB_VERSION);
-    if (nodeList != null && nodeList.getLength() != 0)
-    {
-      node = nodeList.item(0);
-      setVersion(node.getFirstChild().getNodeValue());
-    }
-
-    nodeList = document.getElementsByTagName(_JSP_VERSION);
-    if (nodeList != null && nodeList.getLength() != 0)
-    {
-      node = nodeList.item(0);
-      setJspVersion(node.getFirstChild().getNodeValue());
-    }
-
-    // Must go before _DISPLAY_NAME
-    nodeList = document.getElementsByTagName(_SHORT_NAME);
-    if (nodeList != null && nodeList.getLength() != 0)
-    {
-      node = nodeList.item(0);
-      setPrefix(node.getFirstChild().getNodeValue());
-    }
-
-    // Must go after _SHORT_NAME
-    nodeList = document.getElementsByTagName(_DISPLAY_NAME);
-    if (nodeList != null && nodeList.getLength() != 0)
-    {
-      node = nodeList.item(0);
-      setName(node.getFirstChild().getNodeValue());
-    }
-    else
-    {
-      setName(getPrefix());
-    }
-
-    nodeList = document.getElementsByTagName(_URI);
-    if (nodeList != null && nodeList.getLength() != 0)
-    {
-      node = nodeList.item(0);
-      setURI(node.getFirstChild().getNodeValue());
-    }
-  }
-  
-  //========================================================================
-  // Private variables
-  //========================================================================
-  
-  private String _version    = null; // tlib-version
-  private String _name       = null; // display-name
-  private String _prefix     = null; // short-name
-  private String _jspVersion = null; // jsp-version
-  private String _uri        = null; // uri
- 
-  private final static String _TLIB_VERSION = "tlib-version"; //version NOTRANS
-  private final static String _DISPLAY_NAME = "display-name"; //name NOTRANS
-  private final static String _SHORT_NAME   = "short-name";   //prefix NOTRANS
-  private final static String _JSP_VERSION  = "jsp-version";   //NOTRANS
-  private final static String _URI          = "uri";
-} // endclass TldContentHandler
diff --git a/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.2/project.xml b/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.2/project.xml
deleted file mode 100644
index 69286fe..0000000
--- a/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.2/project.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!--
-  Copyright 2006 The Apache Software Foundation.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<jpr:project xmlns:jpr="http://xmlns.oracle.com/ide/project" >
-  <hash n="component-versions" >
-    <value n="oracle.adfdt.controller.struts.addin.StrutsProjectMigrator" v="10.1.3.0.2" />
-    <value n="oracle.ide.model.Project" v="10.1.3.0.2" />
-    <value n="oracle.jdeveloper.offlinedb.migration.OfflineDBProjectMigrator" v="10.1.3.0.2" />
-    <value n="oracle.jdevimpl.jsp.JspMigrator" v="10.1.3.0.2" />
-    <value n="oracle.jdevimpl.webservices.WebServicesMigratorHelper" v="10.1.3.0.2" />
-  </hash>
-  <list n="contentSets" >
-    <string v="oracle.jdeveloper.model.PathsConfiguration/javaContentSet" />
-    <string v="oracle.jdeveloper.resources.ResourcePaths/resourcesContentSet" />
-    <string v="oracle.jdeveloper.model.J2eeSettings/webContentSet" />
-  </list>
-  <hash n="oracle.ide.model.DependencyConfiguration" >
-    <list n="dependencyList" />
-  </hash>
-  <hash n="oracle.jdeveloper.compiler.OjcConfiguration" >
-    <value n="assertionsEnabled" v="true" />
-    <list n="copyRes" >
-      <string v=".java" />
-    </list>
-    <value n="reverseCopyRes" v="true" />
-    <value n="internalEncoding" v="Default" />
-    <value n="showObjectDotStaticWarnings" v="true" />
-    <value n="showPartialImportWarnings" v="true" />
-    <value n="showUnusedImportWarnings" v="true" />
-  </hash>
-  <hash n="oracle.jdeveloper.model.J2eeSettings" >
-    <value n="j2eeWebAppName" v="maven-generated-webapp" />
-    <value n="j2eeWebContextRoot" v="maven-generated-context-root" />
-    <hash n="webContentSet" >
-      <list n="url-path" />
-    </hash>
-  </hash>
-  <hash n="oracle.jdeveloper.model.PathsConfiguration" >
-    <hash n="javaContentSet" >
-      <list n="pattern-filters" >
-        <string v="+**" />
-      </list>
-      <list n="url-path" />
-    </hash>
-  </hash>
-  <hash n="oracle.jdeveloper.resources.ResourcePaths" >
-    <hash n="resourcesContentSet" >
-      <list n="pattern-filters" >
-        <string v="+**" />
-      </list>
-      <list n="url-path" />
-    </hash>
-  </hash>
-  <hash n="oracle.jdevimpl.config.JProjectLibraries" >
-    <list n="exportedReferences" />
-    <hash n="internalDefinitions" >
-      <list n="libraryDefinitions" />
-    </hash>
-    <list n="libraryReferences" />
-  </hash>
-  <hash n="oracle.jdevimpl.config.JProjectPaths" >
-    <url n="outputDirectory" />
-  </hash>
-  <hash n="oracle.jdevimpl.webapp.jsp.libraries.model.ProjectTagLibraries" >
-    <hash n="libraries" />
-  </hash>
-</jpr:project>
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.2/workspace.xml b/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.2/workspace.xml
deleted file mode 100644
index ebb1ae0..0000000
--- a/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.2/workspace.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!--
-  Copyright 2006 The Apache Software Foundation.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<jws:workspace xmlns:jws="http://xmlns.oracle.com/ide/project">
-  <hash n="component-versions">
-    <value n="oracle.ide.model.Project" v="10.1.3.0.2"/>
-  </hash>
-  <list n="listOfChildren" />
-</jws:workspace>
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.3/project.xml b/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.3/project.xml
deleted file mode 100644
index 9a6006b..0000000
--- a/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.3/project.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version = '1.0' encoding = 'UTF-8'?>
-<!--
-  Copyright 2006 The Apache Software Foundation.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<jpr:project xmlns:jpr="http://xmlns.oracle.com/ide/project">
-   <hash n="component-versions">
-      <value n="oracle.adf.dt.migration.ProjectMigrator" v="10.1.3.0.3"/>
-      <value n="oracle.adfdt.controller.jsf.addin.JSFProjectMigrator" v="10.1.3.0.3"/>
-      <value n="oracle.adfdt.controller.struts.addin.db.ADFStrutsProjectMigrator" v="10.1.3.0.3"/>
-      <value n="oracle.adfdt.controller.struts.addin.StrutsProjectMigrator" v="10.1.3.0.2;10.1.3.0.3"/>
-      <value n="oracle.bm.commonIde.ProjectUpgrader" v="10.1.3.0.3"/>
-      <value n="oracle.ide.model.Project" v="10.1.3.0.2;10.1.3.0.3"/>
-      <value n="oracle.ide.model.ResourcePathsMigrator" v="10.1.3.0.3"/>
-      <value n="oracle.jbo.dt.jclient.migrator.JCProjectMigrator" v="10.1.3.0.3"/>
-      <value n="oracle.jbo.dt.jdevx.ui.appnav.APProjectMigrator" v="10.1.3.0.3"/>
-      <value n="oracle.jdeveloper.dbmodeler.migration.ProjectMigratorHelper" v="10.1.3.0.3"/>
-      <value n="oracle.jdeveloper.offlinedb.migration.OfflineDBProjectMigrator" v="10.1.3.0.2;10.1.3.0.3"/>
-      <value n="oracle.jdevimpl.jsp.JspMigrator" v="10.1.3.0.2;10.1.3.0.3"/>
-      <value n="oracle.jdevimpl.runner.RunConfigurationsMigrator" v="10.1.3.0.3"/>
-      <value n="oracle.jdevimpl.webservices.WebServicesMigratorHelper" v="10.1.3.0.2;10.1.3.0.3"/>
-      <value n="oracle.toplink.addin.migration.TopLinkProjectMigrator" v="10.1.3.0.3"/>
-   </hash>
-   <list n="contentSets">
-      <string v="oracle.jdeveloper.model.PathsConfiguration/javaContentSet"/>
-      <string v="oracle.jdeveloper.model.J2eeSettings/webContentSet"/>
-      <string v="oracle.ide.model.ResourcePaths/resourcesContentSet"/>
-   </list>
-   <hash n="oracle.ide.model.DependencyConfiguration">
-      <list n="dependencyList"/>
-   </hash>
-   <hash n="oracle.ide.model.ResourcePaths">
-      <hash n="resourcesContentSet">
-         <list n="pattern-filters">
-            <string v="+**"/>
-         </list>
-         <list n="url-path" />
-      </hash>
-   </hash>
-   <hash n="oracle.jdeveloper.compiler.OjcConfiguration">
-      <value n="assertionsEnabled" v="true"/>
-      <list n="copyRes">
-         <string v=".java"/>
-      </list>
-      <value n="internalEncoding" v="Default"/>
-      <value n="reverseCopyRes" v="true"/>
-      <value n="showObjectDotStaticWarnings" v="true"/>
-      <value n="showPartialImportWarnings" v="true"/>
-      <value n="showUnusedImportWarnings" v="true"/>
-      <value n="useJavac" v="true"/>
-   </hash>
-   <hash n="oracle.jdeveloper.model.J2eeSettings">
-      <value n="j2eeWebAppName" v="maven-generated-webapp"/>
-      <value n="j2eeWebContextRoot" v="maven-generated-context-root"/>
-      <hash n="webContentSet">
-         <list n="url-path" />
-      </hash>
-   </hash>
-   <hash n="oracle.jdeveloper.model.PathsConfiguration">
-      <hash n="javaContentSet">
-         <list n="pattern-filters">
-            <string v="+**"/>
-         </list>
-         <list n="url-path" />
-      </hash>
-   </hash>
-   <hash n="oracle.jdevimpl.config.JProjectLibraries">
-      <list n="exportedReferences"/>
-      <hash n="internalDefinitions">
-         <list n="libraryDefinitions" />
-      </hash>
-      <list n="libraryReferences" />
-   </hash>
-   <hash n="oracle.jdevimpl.config.JProjectPaths">
-      <url n="outputDirectory" />
-   </hash>
-   <hash n="oracle.jdevimpl.webapp.jsp.libraries.model.ProjectTagLibraries">
-      <hash n="libraries"/>
-   </hash>
-</jpr:project>
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.3/workspace.xml b/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.3/workspace.xml
deleted file mode 100644
index 9e48d9a..0000000
--- a/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.3/workspace.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version = '1.0' encoding = 'UTF-8'?>
-<!--
-  Copyright 2006 The Apache Software Foundation.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<jws:workspace xmlns:jws="http://xmlns.oracle.com/ide/project">
-   <hash n="component-versions">
-      <value n="oracle.ide.model.Project" v="10.1.3.0.2;10.1.3.0.3"/>
-   </hash>
-   <list n="listOfChildren" />
-</jws:workspace>
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.4/project.xml b/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.4/project.xml
deleted file mode 100644
index 42814d1..0000000
--- a/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.4/project.xml
+++ /dev/null
@@ -1,127 +0,0 @@
-<?xml version = '1.0' encoding = 'UTF-8'?>
-<!--
-  Copyright 2006 The Apache Software Foundation.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<jpr:project xmlns:jpr="http://xmlns.oracle.com/ide/project">
-  <hash n="component-versions">
-    <value n="oracle.adf.dt.migration.ProjectMigrator" v="10.1.3.0.3;10.1.3.0.4"/>
-    <value n="oracle.adfdt.controller.jsf.addin.JSFProjectMigrator" v="10.1.3.0.3;10.1.3.0.4"/>
-    <value n="oracle.adfdt.controller.struts.addin.db.ADFStrutsProjectMigrator" v="10.1.3.0.3;10.1.3.0.4"/>
-    <value n="oracle.adfdt.controller.struts.addin.StrutsProjectMigrator" v="10.1.3.0.2;10.1.3.0.3;10.1.3.0.4"/>
-    <value n="oracle.bm.commonIde.ProjectUpgrader" v="10.1.3.0.3;10.1.3.0.4"/>
-    <value n="oracle.ide.model.Project" v="10.1.3.0.2;10.1.3.0.3;10.1.3.0.4"/>
-    <value n="oracle.ide.model.ResourcePathsMigrator" v="10.1.3.0.3;10.1.3.0.4"/>
-    <value n="oracle.jbo.dt.jclient.migrator.JCProjectMigrator" v="10.1.3.0.3;10.1.3.0.4"/>
-    <value n="oracle.jbo.dt.jdevx.ui.appnav.APProjectMigrator" v="10.1.3.0.3;10.1.3.0.4"/>
-    <value n="oracle.jdeveloper.dbmodeler.migration.ProjectMigratorHelper" v="10.1.3.0.3;10.1.3.0.4"/>
-    <value n="oracle.jdeveloper.offlinedb.migration.OfflineDBProjectMigrator" v="10.1.3.0.2;10.1.3.0.3;10.1.3.0.4"/>
-    <value n="oracle.jdevimpl.jsp.JspMigrator" v="10.1.3.0.2;10.1.3.0.3;10.1.3.0.4"/>
-    <value n="oracle.jdevimpl.runner.RunConfigurationsMigrator" v="10.1.3.0.3;10.1.3.0.4"/>
-    <value n="oracle.jdevimpl.webservices.WebServicesMigratorHelper" v="10.1.3.0.2;10.1.3.0.3;10.1.3.0.4"/>
-    <value n="oracle.toplink.addin.migration.TopLinkProjectMigrator" v="10.1.3.0.3;10.1.3.0.4"/>
-  </hash>
-  <list n="contentSets">
-    <string v="oracle.jdeveloper.model.PathsConfiguration/javaContentSet"/>
-    <string v="oracle.jdeveloper.model.J2eeSettings/webContentSet"/>
-    <string v="oracle.ide.model.ResourcePaths/resourcesContentSet"/>
-    <string v="oracle.jdeveloper.offlinedb.model.OfflineDBProjectSettings/offlineDBContentSet"/>
-    <string v="oracle.toplink.addin.TopLinkProjectSettings/toplinkContentSet"/>
-    <string v="oracle.bm.commonIde.data.project.ModelerProjectSettings/modelersContentSet"/>
-  </list>
-  <hash n="oracle.bm.commonIde.data.project.ModelerProjectSettings">
-    <hash n="modelersContentSet">
-      <list n="pattern-filters">
-        <string v="+**"/>
-      </list>
-      <list n="url-path">
-        <url path="model/"/>
-      </list>
-    </hash>
-    <value n="modelersVersion" v="10.13"/>
-  </hash>
-  <hash n="oracle.ide.model.DependencyConfiguration">
-    <list n="dependencyList"/>
-  </hash>
-  <hash n="oracle.ide.model.ResourcePaths">
-    <hash n="resourcesContentSet">
-      <list n="pattern-filters">
-        <string v="+**"/>
-      </list>
-      <list n="url-path" />
-    </hash>
-  </hash>
-  <hash n="oracle.jdeveloper.compiler.OjcConfiguration">
-    <value n="internalEncoding" v="Default"/>
-  </hash>
-  <hash n="oracle.jdeveloper.model.J2eeSettings">
-    <value n="j2eeWebAppName" v="maven-generated-webapp"/>
-    <value n="j2eeWebContextRoot" v="maven-generated-context-root"/>
-    <hash n="webContentSet">
-      <list n="url-path" />
-    </hash>
-  </hash>
-  <hash n="oracle.jdeveloper.model.PathsConfiguration">
-    <hash n="javaContentSet">
-      <list n="pattern-filters">
-        <string v="+**"/>
-      </list>
-      <list n="url-path" />
-    </hash>
-  </hash>
-  <hash n="oracle.jdeveloper.offlinedb.model.OfflineDBProjectSettings">
-    <hash n="offlineDBContentSet">
-      <list n="pattern-filters">
-        <string v="+**"/>
-      </list>
-      <list n="url-path">
-        <url path="database/"/>
-      </list>
-    </hash>
-  </hash>
-  <hash n="oracle.jdeveloper.runner.RunConfigurations">
-    <hash n="runConfigurationDefinitions">
-      <hash n="Default">
-        <value n="custom" v="false"/>
-        <value n="name" v="Default"/>
-      </hash>
-    </hash>
-    <list n="runConfigurationList">
-      <string v="Default"/>
-    </list>
-  </hash>
-  <hash n="oracle.jdevimpl.config.JProjectLibraries">
-    <list n="exportedReferences"/>
-    <hash n="internalDefinitions">
-      <list n="libraryDefinitions" />
-    </hash>
-    <list n="libraryReferences" />
-  </hash>
-  <hash n="oracle.jdevimpl.config.JProjectPaths">
-    <url n="outputDirectory" />
-  </hash>
-  <hash n="oracle.jdevimpl.webapp.jsp.libraries.model.ProjectTagLibraries">
-    <hash n="libraries"/>
-  </hash>
-  <hash n="oracle.toplink.addin.TopLinkProjectSettings">
-    <hash n="toplinkContentSet">
-      <list n="pattern-filters">
-        <string v="+**"/>
-      </list>
-      <list n="url-path">
-        <url path="toplink/"/>
-      </list>
-    </hash>
-  </hash>
-</jpr:project>
diff --git a/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.4/workspace.xml b/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.4/workspace.xml
deleted file mode 100644
index c695364..0000000
--- a/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/10.1.3.0.4/workspace.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version = '1.0' encoding = 'UTF-8'?>
-<!--
-  Copyright 2006 The Apache Software Foundation.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<jws:workspace xmlns:jws="http://xmlns.oracle.com/ide/project">
-   <hash n="component-versions">
-      <value n="oracle.ide.model.Project" v="10.1.3.0.4"/>
-      <value n="oracle.jdevimpl.xml.oc4j.ds.DataSourcesMigratorHelper" v="10.1.3.0.4"/>
-   </hash>
-   <list n="listOfChildren" />
-</jws:workspace>
diff --git a/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/11.1.1.0.0/project.xml b/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/11.1.1.0.0/project.xml
deleted file mode 100644
index b0b77f3..0000000
--- a/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/11.1.1.0.0/project.xml
+++ /dev/null
@@ -1,203 +0,0 @@
-<?xml version = '1.0' encoding = 'UTF-8'?>
-<!--
-  Copyright 2006 The Apache Software Foundation.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<jpr:project xmlns:jpr="http://xmlns.oracle.com/ide/project">
-   <hash n="component-versions">
-    <value n="oracle.adfdt.controller.adfc.source.migration.MoveMetadataResourcesAgainMigrator" v="11.1.1.0.0"/>
-    <value n="oracle.adfdt.controller.jsf2.diagram.migrate.JsfNodeMigratorHelper" v="11.1.1.0.0"/>
-    <value n="oracle.adfdt.controller.struts.addin.db.ADFStrutsProjectMigrator" v="10.1.3.0.3;10.1.3.0.4;11.1.1.0.0"/>
-    <value n="oracle.adfdt.controller.struts.addin.StrutsProjectMigrator" v="10.1.3.0.2;10.1.3.0.3;10.1.3.0.4;11.1.1.0.0"/>
-    <value n="oracle.adfdtinternal.dvt.datapresdt.migration.JspProjectMigrator" v="11.1.1.0.0"/>
-    <value n="oracle.adfdtinternal.model.ide.migration.ProjectMigrator" v="11.1.1.0.0.1;11.1.1.0.0.11"/>
-    <value n="oracle.adfdtinternal.model.ide.xmled.migration.ADFNodeMigrator" v="11.1.1.0.0.5"/>
-    <value n="oracle.adfdtinternal.view.common.migration.wizards.MigrationHelper" v="11.1.1.0.0.3"/>
-    <value n="oracle.adfdtinternal.view.rich.binding.migration.JarResourceMigrator" v="11.1.1.0.0"/>
-    <value n="oracle.bm.commonIde.ProjectUpgrader" v="10.1.3.0.3;10.1.3.0.4;11.1.1.0.0"/>
-    <value n="oracle.bm.migration.project.MigratorRegistryProjectUpgradeAdapter" v="11.1.1.0.0"/>
-    <value n="oracle.ide.model.Project" v="10.1.3.0.2;10.1.3.0.3;10.1.3.0.4;11.1.1.0.0"/>
-    <value n="oracle.ide.model.ResourcePathsMigrator" v="10.1.3.0.3;10.1.3.0.4;11.1.1.0.0"/>
-    <value n="oracle.jbo.dt.jclient.migrator.JCProjectMigrator" v="10.1.3.0.3;10.1.3.0.4;11.1.1.0.0"/>
-    <value n="oracle.jbo.dt.jdevx.ui.appnav.APProjectMigrator" v="10.1.3.0.3;10.1.3.0.4;11.1.1.0.0.5"/>
-    <value n="oracle.jdeveloper.ejb.EjbMigrator" v="10.1.3.4.0;11.1.1.0.0"/>
-    <value n="oracle.jdeveloper.library.ProjectLibraryMigrator" v="11.1.1.0.0"/>
-    <value n="oracle.jdeveloper.model.OutputDirectoryMigrator" v="11.1.1.0.0"/>
-    <value n="oracle.jdevimpl.deploy.DeploymentProfilesMigrator" v="11.1.1.0.0.1"/>
-    <value n="oracle.jdevimpl.deploy.jps.JpsDataMigrator" v="11.1.1.0.0"/>
-    <value n="oracle.jdevimpl.jsp.JspMigrator" v="10.1.3.0.2;10.1.3.0.3;10.1.3.0.4;11.1.1.0.0"/>
-    <value n="oracle.jdevimpl.junit.JUnitMigrator" v="11.1.1.0.0.1"/>
-    <value n="oracle.jdevimpl.offlinedb.migration.OfflineDBProjectMigrator" v="11.1.1.0.0"/>
-    <value n="oracle.jdevimpl.offlinedb.migration.OfflineTransferMigrator" v="11.1.1.0.0"/>
-    <value n="oracle.jdevimpl.resourcebundle.XliffAddin$XliffMigratorHelper" v="11.1.1.0.0"/>
-    <value n="oracle.jdevimpl.runner.RunConfigurationsMigrator" v="10.1.3.0.3;10.1.3.0.4;11.1.1.0.0"/>
-    <value n="oracle.jdevimpl.webapp.jsp.libraries.JspLibraryMigrator" v="11.1.1.0.0"/>
-    <value n="oracle.jdevimpl.webapp.WebAppNodeMigratorHelper" v="11.1.1.0.0"/>
-    <value n="oracle.jdevimpl.webservices.WebServicesMigratorHelper" v="10.1.3.0.2;10.1.3.0.3;10.1.3.0.4;11.1.1.0.0"/>
-    <value n="oracle.modeler.bmmigrate.dif.MigrateToDIF" v="11.1.1.0.0"/>
-    <value n="oracle.tip.tools.ide.pm.addin.migrator.PMProjectMigrator" v="11.1.1.0.0"/>
-    <value n="oracle.toplink.addin.migration.TopLinkProjectMigrator" v="10.1.3.0.3;10.1.3.0.4;11.1.1.0.0"/>
-    <value n="oracle.toplink.workbench.addin.migration.TopLinkProjectMigrator" v="11.1.1.0.0"/>
-    <value n="oracle.webcenter.internal.dt.migration.WebCenterProjectMigrator" v="11.1.1.0.0"/>
-   </hash>
-   <list n="contentSets">
-      <string v="oracle.jdeveloper.model.PathsConfiguration/javaContentSet"/>
-      <string v="oracle.jdeveloper.model.J2eeSettings/webContentSet"/>
-      <string v="oracle.ide.model.ResourcePaths/resourcesContentSet"/>
-      <string v="oracle.jdeveloper.offlinedb.model.OfflineDBProjectSettings/offlineDBContentSet"/>
-      <string v="oracle.tip.tools.ide.pm.addin.PMProjectSettings/Integration_Content"/>
-      <string v="oracle.bm.commonIde.data.project.ModelerProjectSettings/modelersContentSet"/>
-      <string v="oracle.toplink.workbench.addin/toplinkContentSet"/>
-      <string v="oracle.tip.tools.ide.fabric.addin.SCAContentSetProvider/sca-content"/>
-      <string v="oracle.adfdtinternal.model.ide.settings.ADFMSettings/adfmContentSet"/>
-   </list>
-      <hash n="oracle.adfdtinternal.model.ide.settings.ADFMSettings">
-      <hash n="adfmContentSet">
-         <list n="pattern-filters">
-            <string v="+**"/>
-         </list>
-         <list n="url-path">
-            <url path="adfmsrc/"/>
-         </list>
-      </hash>
-   </hash>
-   <hash n="oracle.bm.commonIde.data.project.ModelerProjectSettings">
-      <hash n="modelersContentSet">
-         <list n="url-path">
-            <url path="model/"/>
-         </list>
-      </hash>
-      <value n="modelersVersion" v="10.13"/>
-   </hash>
-   <hash n="oracle.ide.model.DependencyConfiguration">
-      <list n="dependencyList"/>
-   </hash>
-   <hash n="oracle.ide.model.ResourcePaths">
-      <hash n="resourcesContentSet">
-         <list n="pattern-filters">
-            <string v="+**"/>
-         </list>
-         <list n="url-path"/>
-      </hash>
-   </hash>
-   <hash n="oracle.jdeveloper.compiler.OjcConfiguration">
-      <value n="assertionsEnabled" v="true"/>
-      <value n="compiler.name" v="Ojc"/>
-      <list n="copyRes">
-         <string v=".java"/>
-      </list>
-      <value n="internalEncoding" v="Default"/>
-      <list n="Javac.commandline.optionlist">
-         <string v="-g"/>
-         <string v="-Xlint:all"/>
-         <string v="-Xlint:-cast"/>
-         <string v="-Xlint:-empty"/>
-         <string v="-Xlint:-fallthrough"/>
-         <string v="-Xlint:-path"/>
-         <string v="-Xlint:-serial"/>
-         <string v="-Xlint:-unchecked"/>
-      </list>
-      <list n="Ojc.commandline.optionlist">
-         <string v="-g"/>
-         <string v="-warn"/>
-         <string v="-nowarn:320"/>
-         <string v="-nowarn:372"/>
-         <string v="-nowarn:412"/>
-         <string v="-nowarn:413"/>
-         <string v="-nowarn:415"/>
-         <string v="-nowarn:486"/>
-         <string v="-nowarn:487"/>
-         <string v="-nowarn:489"/>
-         <string v="-nowarn:556"/>
-         <string v="-nowarn:558"/>
-         <string v="-nowarn:560"/>
-         <string v="-nowarn:561"/>
-         <string v="-nowarn:705"/>
-         <string v="-Xlint:-fallthrough"/>
-         <string v="-Xlint:-serial"/>
-         <string v="-Xlint:-unchecked"/>
-      </list>
-      <value n="reverseCopyRes" v="true"/>
-      <value n="showObjectDotStaticWarnings" v="true"/>
-      <value n="showPartialImportWarnings" v="true"/>
-      <value n="showUnusedImportWarnings" v="true"/>
-   </hash>
-   <hash n="oracle.jdeveloper.model.J2eeSettings">
-      <value n="j2eeWebAppName" v="maven-generated-webapp"/>
-      <value n="j2eeWebContextRoot" v="maven-generated-context-root"/>
-      <hash n="webContentSet">
-         <list n="url-path" />
-      </hash>
-   </hash>
-   <hash n="oracle.jdeveloper.model.PathsConfiguration">
-      <hash n="javaContentSet">
-        <list n="constituent-sets" />
-      </hash>
-   </hash>
-   <hash n="oracle.jdeveloper.offlinedb.model.OfflineDBProjectSettings">
-      <hash n="offlineDBContentSet">
-         <list n="pattern-filters">
-            <string v="+**"/>
-         </list>
-         <list n="url-path">
-            <url path="database/"/>
-         </list>
-      </hash>
-   </hash>
-   <hash n="oracle.jdeveloper.runner.RunConfigurations">
-      <hash n="runConfigurationDefinitions">
-         <hash n="Default">
-            <value n="compileBeforeRun" v="false"/>
-            <value n="custom" v="false"/>
-            <value n="name" v="Default"/>
-         </hash>
-      </hash>
-      <list n="runConfigurationList">
-         <string v="Default"/>
-      </list>
-   </hash>
-   <hash n="oracle.jdevimpl.config.JProjectLibraries">
-      <list n="exportedReferences"/>
-      <hash n="internalDefinitions">
-         <list n="libraryDefinitions" />
-      </hash>
-      <list n="libraryReferences"/>
-   </hash>
-   <hash n="oracle.jdevimpl.config.JProjectPaths"/>
-   <hash n="oracle.jdevimpl.webapp.jsp.libraries.model.ProjectTagLibraries">
-      <list n="tag-libraries"/>
-   </hash>
-   <hash n="oracle.tip.tools.ide.fabric.addin.SCAContentSetProvider">
-      <hash n="sca-content"/>
-   </hash>
-   <hash n="oracle.tip.tools.ide.pm.addin.PMProjectSettings">
-     <hash n="Integration_Content">
-       <list n="pattern-filters">
-         <string v="+**"/>
-       </list>
-     </hash>
-   </hash>
-   <hash n="oracle.toplink.workbench.addin">
-      <hash n="toplinkContentSet">
-         <list n="pattern-filters">
-            <string v="+**"/>
-         </list>
-         <list n="url-path">
-            <url path="toplink/"/>
-         </list>
-      </hash>
-   </hash>
-</jpr:project>
-
-
diff --git a/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/11.1.1.0.0/workspace.xml b/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/11.1.1.0.0/workspace.xml
deleted file mode 100644
index 42cbeae..0000000
--- a/maven2-plugins/myfaces-jdev-plugin/src/main/resources/org/apache/myfaces/buildtools/maven2/plugin/jdeveloper/11.1.1.0.0/workspace.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version = '1.0' encoding = 'UTF-8'?>
-<!--
-  Copyright 2006 The Apache Software Foundation.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<jws:workspace xmlns:jws="http://xmlns.oracle.com/ide/project">
-   <hash n="component-versions">
-      <value n="oracle.adf.share.dt.migration.jps.JaznCredStoreMigratorHelper" v="11.1.1.0.0"/>
-      <value n="oracle.adfdtinternal.model.ide.security.wizard.AdfSecurityMigrator" v="11.1.1.0.0"/>
-      <value n="oracle.ide.model.Project" v="10.1.3.0.4;11.1.1.0.0"/>
-      <value n="oracle.jdevimpl.runner.oc4j.EmbeddedServerMigratorHelper" v="11.1.1.0.0"/>
-      <value n="oracle.jdevimpl.webservices.WebServicesMigratorHelper" v="11.1.1.0.0"/>
-      <value n="oracle.jdevimpl.xml.oc4j.ds.DataSourcesMigratorHelper" v="11.1.1.0.0"/>
-      <value n="oracle.jdevimpl.xml.oc4j.jps.JpsConfigMigratorHelper" v="11.1.1.0.0"/>
-      <value n="oracle.mds.internal.dt.ide.migrator.MDSConfigMigratorHelper" v="11.1.1.0.0"/>
-      <value n="oracle.webcenter.internal.dt.migration.WebCenterWorkspaceMigrator" v="11.1.1.0.0"/>
-   </hash>
-   <list n="listOfChildren" />
-</jws:workspace>
diff --git a/maven2-plugins/myfaces-plugin-parent/LICENSE.txt b/maven2-plugins/myfaces-plugin-parent/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/maven2-plugins/myfaces-plugin-parent/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/maven2-plugins/myfaces-plugin-parent/NOTICE.txt b/maven2-plugins/myfaces-plugin-parent/NOTICE.txt
deleted file mode 100644
index fa3dbd6..0000000
--- a/maven2-plugins/myfaces-plugin-parent/NOTICE.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-=========================================================================
-==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
-==  Version 2.0, in this case for the Apache MyFaces Maven Plugins     ==
-=========================================================================
-
-This product includes software developed by 
-The Apache Software Foundation (http://www.apache.org/).
-
-Portions of this software were originally based on the following:
-
- - software copyright (c) 2000-2006, Oracle Corp, <http://www.oracle.com/>.
-and are licensed to the Apache Software Foundation under the 
-"Software Grant and Corporate Contribution License Agreement"
-
-See the LICENSE.txt file for information on all licenses 
-associated with this software.
diff --git a/maven2-plugins/myfaces-plugin-parent/pom.xml b/maven2-plugins/myfaces-plugin-parent/pom.xml
deleted file mode 100644
index 2910524..0000000
--- a/maven2-plugins/myfaces-plugin-parent/pom.xml
+++ /dev/null
@@ -1,253 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
--->
-
-<!--
-  - Parent pom of all the myfaces custom maven-plugin subprojects that help
-    to build other myfaces projects.
-  -
-  - This project also builds a common build-tools site.
-  -->
-
-<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>
-    <groupId>org.apache.myfaces</groupId>
-    <artifactId>myfaces</artifactId>
-    <version>6</version>
-  </parent>
-
-  <groupId>org.apache.myfaces.buildtools</groupId>
-  <artifactId>myfaces-plugin-parent</artifactId>
-  <version>1.0.3-SNAPSHOT</version>
-  <packaging>pom</packaging>
-  <name>Apache MyFaces Buildtools Maven2 Plugin Parent</name>
-  <url>http://myfaces.apache.org/build-tools/plugins</url>
-
-  <issueManagement>
-    <system>jira</system>
-    <url>http://issues.apache.org/jira/browse/MYFACES</url>
-  </issueManagement>
-
-  <ciManagement>
-    <system>continuum</system>
-    <url>http://myfaces.zones.apache.org:8080/continuum</url>
-    <notifiers>
-      <notifier>
-        <type>mail</type>
-        <sendOnSuccess>true</sendOnSuccess>
-        <configuration>
-          <address>commits@myfaces.apache.org</address>
-        </configuration>
-      </notifier>
-    </notifiers>
-  </ciManagement>
-
-  <inceptionYear>2001</inceptionYear>
-
-  <build>
-    <resources>
-      <resource>
-        <directory>${basedir}</directory>
-        <targetPath>META-INF</targetPath>
-        <includes>
-          <include>NOTICE.txt</include>
-          <include>LICENSE.txt</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/src/main/resources</directory>
-      </resource>
-    </resources>
-
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <artifactId>maven-jar-plugin</artifactId>
-          <version>2.2</version>
-          <configuration>
-            <archive>
-              <manifest>
-                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-              </manifest>
-            </archive>
-          </configuration>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-
-    <plugins>
-      <plugin>
-        <!--
-          - Copy LICENSE.txt and NOTICE.txt so that they are included
-          - in the -javadoc jar file for the component.
-          -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-antrun-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>javadoc.resources</id>
-            <phase>generate-sources</phase>
-            <goals>
-              <goal>run</goal>
-            </goals>
-            <configuration>
-              <tasks>
-                <copy todir="${project.build.directory}/apidocs/META-INF">
-                  <fileset dir="${basedir}">
-                    <include name="LICENSE.txt" />
-                    <include name="NOTICE.txt" />
-                  </fileset>
-                </copy>
-              </tasks>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <!--
-          - Make a checkstyle violation a compile error. Note that if a compile error occurs,
-          - further information can be found in target/site/checkstyle.html (present even when
-          - just the compile goal and not the site goal has been run). Note also that child
-          - projects may redeclare this plugin and provide different configuration settings
-          - to use different checks (more or less strict than the default).
-          -->
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-checkstyle-plugin</artifactId>
-        <version>2.2</version>
-        <executions>
-          <execution>
-            <id>verify-style</id>
-            <phase>verify</phase>
-            <goals><goal>check</goal></goals>
-          </execution>
-        </executions>
-        <configuration>
-          <configLocation>default/myfaces-checks-standard.xml</configLocation>
-          <headerLocation>default/myfaces-header-spaces.txt</headerLocation>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <artifactId>maven-project-info-reports-plugin</artifactId>
-        <version>2.0.1</version>
-      </plugin>
-      <plugin>
-        <artifactId>maven-pmd-plugin</artifactId>
-        <version>2.3</version>
-        <configuration>
-          <rulesets>
-            <ruleset>/rulesets/basic.xml</ruleset>
-            <ruleset>/rulesets/unusedcode.xml</ruleset>
-          </rulesets>
-          <linkXref>true</linkXref>
-          <minimumTokens>100</minimumTokens>
-          <targetJdk>1.5</targetJdk>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-checkstyle-plugin</artifactId>
-        <version>2.2</version>
-        <configuration>
-          <configLocation>default/myfaces-checks-standard.xml</configLocation>
-          <headerLocation>default/myfaces-header-spaces.txt</headerLocation>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/myfaces/myfaces-build-tools/trunk/maven2-plugins/</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/myfaces/myfaces-build-tools/trunk/maven2-plugins/</developerConnection>
-    <url>http://svn.apache.org/viewvc/myfaces/myfaces-build-tools/trunk/maven2-plugins/</url>
-  </scm>
-
-  <distributionManagement>
-    <snapshotRepository>
-      <uniqueVersion>false</uniqueVersion>
-      <id>apache.snapshots</id>
-      <name>Apache Maven Snapshot Repository</name>
-      <url>scpexe://people.apache.org/www/people.apache.org/repo/m2-snapshot-repository</url>
-    </snapshotRepository>
-    <site>
-      <id>apache-site</id>
-      <url>scpexe://people.apache.org/www/myfaces.apache.org/build-tools/plugins</url>
-    </site>
-  </distributionManagement>
-
-  <profiles>
-    <profile>
-      <id>release</id>
-      <!--
-      NOTE: Execute this profile like
-            mvn clean source:jar install deploy -DaltDeploymentRepository=matzew::default::file://FOLDER -Prelease
-       -->
-      <build>
-        <plugins>
-          <plugin>
-            <artifactId>maven-gpg-plugin</artifactId>
-            <version>1.0-alpha-4</version>
-            <executions>
-              <execution>
-                <id>sign-artifacts</id>
-                <phase>verify</phase>
-                <goals>
-                  <goal>sign</goal>
-                </goals>
-              </execution>
-            </executions>
-          </plugin>
-          <plugin>
-            <artifactId>maven-javadoc-plugin</artifactId>
-            <version>2.3</version>
-            <executions>
-              <execution>
-                <id>attach-javadocs</id>
-                <goals>
-                  <goal>jar</goal>
-                </goals>
-              </execution>
-            </executions>
-          </plugin>
-          <plugin>
-            <artifactId>maven-scm-plugin</artifactId>
-            <version>1.0</version>
-            <executions>
-              <execution>
-                <phase>validate</phase>
-                <id>getting-scm.revision</id>
-                <goals>
-                  <goal>update</goal>
-                </goals>
-              </execution>
-            </executions>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-  </profiles>
-</project>
diff --git a/maven2-plugins/myfaces-plugin-parent/src/site/apt/index.apt b/maven2-plugins/myfaces-plugin-parent/src/site/apt/index.apt
deleted file mode 100644
index dbef114..0000000
--- a/maven2-plugins/myfaces-plugin-parent/src/site/apt/index.apt
+++ /dev/null
@@ -1,77 +0,0 @@
- ------
- Myfaces Build Tools
- ------
-
-Overview
-
-  MyFaces projects all use Maven 2.x to compile the code, run testing, etc. However sometimes
-  the standard maven plugins are not enough for the special requirements of MyFaces projects.
-  Therefore a number of custom Maven plugins have been created.
-
-Plugins
-
-* MyFaces-Builder-Plugin
-
-  Used to build MyFaces Core 1.1.6 and later, and MyFaces Tomahawk 1.1.7 and later.
-  May be used to build other projects in the future.
-
-  This plugin uses annotations on java source files to discover which are JSF
-  components, renderers, etc. This information is used to automatically generate a
-  suitable faces-config.xml and JSP ".tld" files. The annotations can be "real"
-  java1.5 annotations, or doclet-style annotations.
-
-  In addition, the plugin can automatically generate JSP tag classes for JSF components,
-  automatically copying tag attributes onto a JSF component instance.
-
-  And when selected, the builder plugin can also automatically generate JSF component
-  classes, defining "boilerplate" setter/getter and save/restore methods based upon the
-  abstract properties defined on an ancestor class.
-
-  This plugin may also be useful for projects external to the MyFaces project.
-
-* MyFaces-Builder-Annotations
-
-  A set of java1.5 Annotation classes for use with the MyFaces-Builder-Plugin.
-
-* MyFaces-Faces-Plugin
-
-  A refactored/renamed version of the MyFaces-Trinidad-Plugin whose source is within
-  the trinidad project.
-
-  This plugin is not currently in use.
-
-  This renamed version was intended to be used in Trinidad and Core 1.2.x releases,
-  but the MyFaces-Builder-Plugin is currently intended to be used instead.
-
-  The original MyFaces-Trinidad-Plugin was used for MyFaces Core 1.2.x releases, and
-  for all Trinidad releases. It reads a tree of xml files which define the properties
-  of JSF components in a project, and then generates faces-config.xml and .tld files,
-  and also can generate Component and Tag classes.
-
-* MyFaces-i18n-plugin
-
-  TODO: document me
-
-* MyFaces-javacc-plugin
-
-  TODO: document me
-
-* MyFaces-javascript-plugin
-
-  TODO: document me
-
-* MyFaces-jdev-plugin
-
-  TODO: document me 
-
-* MyFaces-tagdoc-plugin
-
-  TODO: document me
-
-* MyFaces-Wagon-Plugin
-
-  TODO: document me
-
-* MyFaces-xrts-plugin
-
-  TODO: document me
diff --git a/maven2-plugins/myfaces-plugin-parent/src/site/site.xml b/maven2-plugins/myfaces-plugin-parent/src/site/site.xml
deleted file mode 100644
index f47fdcb..0000000
--- a/maven2-plugins/myfaces-plugin-parent/src/site/site.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
--->
-
-<project name="Apache MyFaces Buildtools">
-  <bannerLeft>
-    <name>Apache MyFaces</name>
-    <src>img/banners/MyFaces_logo.jpg</src>
-    <href>http://myfaces.apache.org/index.html</href>
-  </bannerLeft>
-
-  <bannerRight>
-    <name>Apache Banner</name>
-    <src>img/banners/apache_banner.png</src>
-    <href>http://www.apache.org/</href>
-  </bannerRight>  
-
-  <publishDate format="dd MMM yyyy"/>
-
-  <skin>
-    <groupId>org.apache.myfaces.maven</groupId>
-    <artifactId>myfaces-site-skin</artifactId>
-    <version>1-SNAPSHOT</version>
-  </skin>
-
-  <body>
-    <links>
-      <item name="Apache" href="http://www.apache.org"/>
-      <item name="MyFaces" href="http://myfaces.apache.org/index.html"/>
-    </links>
-
-    <menu name="Apache MyFaces" inherit="top">
-      <item name="Overview"       href="http://myfaces.apache.org/index.html"/>
-      <item name="Download"       href="http://myfaces.apache.org/download.html"/>
-    </menu>
-
-    <menu name="Documentation">
-      <item name="About"         href="index.html"/>
-    </menu>
-
-    <menu ref="reports"/>
-	
-    <menu name="Available Modules" inherit="bottom">
-      <item name="Apache MyFaces Buildtools Maven2 Builder Annotations"      href="http://myfaces.apache.org/build-tools/plugins/myfaces-builder-annotations/index.html"/>
-      <item name="Apache MyFaces Buildtools Maven2 Builder Plugin"           href="http://myfaces.apache.org/build-tools/plugins/myfaces-builder-plugin/index.html"/>
-      <item name="Apache MyFaces Buildtools Maven2 Faces Plugin"             href="http://myfaces.apache.org/build-tools/plugins/myfaces-faces-plugin/index.html"/>
-      <item name="Apache MyFaces Buildtools Maven2 i18n Plugin"              href="http://myfaces.apache.org/build-tools/plugins/myfaces-i18n-plugin/index.html"/>
-      <item name="Apache MyFaces Buildtools Maven2 Javacc Plugin"            href="http://myfaces.apache.org/build-tools/plugins/myfaces-javacc-plugin/index.html"/>
-      <item name="Apache MyFaces Buildtools Maven2 Javascript Plugin"        href="http://myfaces.apache.org/build-tools/plugins/myfaces-javascript-plugin/index.html"/>
-      <item name="Apache MyFaces Buildtools Maven2 JDev Plugin"              href="http://myfaces.apache.org/build-tools/plugins/myfaces-jdev-plugin/index.html"/>
-      <item name="Apache MyFaces Buildtools Maven2 Tag Documentation Report" href="http://myfaces.apache.org/build-tools/plugins/myfaces-tagdoc-plugin/index.html"/>
-      <item name="Apache MyFaces Buildtools Maven2 Wagon Plugin"             href="http://myfaces.apache.org/build-tools/plugins/myfaces-wagon-plugin/index.html"/>
-      <item name="Apache MyFaces Buildtools Maven2 XRTS Plugin"              href="http://myfaces.apache.org/build-tools/plugins/myfaces-xrts-plugin/index.html"/>
-    </menu>
-
-    <menu name="Foundation" inherit="bottom">
-      <item name="ASF"            href="http://www.apache.org/" />
-      <item name="Sponsorship"    href="http://www.apache.org/foundation/sponsorship.html" />
-      <item name="Thanks"         href="http://www.apache.org/foundation/thanks.html" />
-    </menu>
-  </body>
-</project>
diff --git a/maven2-plugins/myfaces-tagdoc-plugin/LICENSE.txt b/maven2-plugins/myfaces-tagdoc-plugin/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/maven2-plugins/myfaces-tagdoc-plugin/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/maven2-plugins/myfaces-tagdoc-plugin/NOTICE.txt b/maven2-plugins/myfaces-tagdoc-plugin/NOTICE.txt
deleted file mode 100644
index fa3dbd6..0000000
--- a/maven2-plugins/myfaces-tagdoc-plugin/NOTICE.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-=========================================================================
-==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
-==  Version 2.0, in this case for the Apache MyFaces Maven Plugins     ==
-=========================================================================
-
-This product includes software developed by 
-The Apache Software Foundation (http://www.apache.org/).
-
-Portions of this software were originally based on the following:
-
- - software copyright (c) 2000-2006, Oracle Corp, <http://www.oracle.com/>.
-and are licensed to the Apache Software Foundation under the 
-"Software Grant and Corporate Contribution License Agreement"
-
-See the LICENSE.txt file for information on all licenses 
-associated with this software.
diff --git a/maven2-plugins/myfaces-tagdoc-plugin/pom.xml b/maven2-plugins/myfaces-tagdoc-plugin/pom.xml
deleted file mode 100644
index df35a01..0000000
--- a/maven2-plugins/myfaces-tagdoc-plugin/pom.xml
+++ /dev/null
@@ -1,149 +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.
--->
-
-<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>
-    <groupId>org.apache.myfaces.buildtools</groupId>
-    <artifactId>myfaces-plugin-parent</artifactId>
-    <version>1.0.2</version>
-  </parent>
-
-  <groupId>org.apache.myfaces.buildtools</groupId>
-  <artifactId>myfaces-tagdoc-plugin</artifactId>
-  <version>1.0.1-SNAPSHOT</version>
-  <packaging>maven-plugin</packaging>
-  <name>Apache MyFaces Buildtools Maven2 Tag Documentation Report</name>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <inherited>true</inherited>
-        <configuration>
-          <source>1.4</source>
-          <target>1.4</target>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-      <version>2.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven.reporting</groupId>
-      <artifactId>maven-reporting-impl</artifactId>
-      <version>2.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId>
-      <version>2.0</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-digester</groupId>
-      <artifactId>commons-digester</artifactId>
-      <version>1.7</version>
-    </dependency>
-    <dependency>
-      <groupId>saxon</groupId>
-      <artifactId>saxon</artifactId>
-      <version>6.5.3</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>xerces</groupId>
-      <artifactId>xercesImpl</artifactId>
-      <version>2.6.2</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>stax</groupId>
-      <artifactId>stax-api</artifactId>
-      <version>1.0.1</version>
-    </dependency>
-    <dependency>
-      <groupId>stax</groupId>
-      <artifactId>stax</artifactId>
-      <version>1.2.0_rc2-dev</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.myfaces.buildtools</groupId>
-      <artifactId>myfaces-faces-plugin</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId>
-      <version>2.0.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-container-default</artifactId>
-      <version>1.0-alpha-8</version>
-    </dependency>
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-utils</artifactId>
-      <version>1.0.5</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven.doxia</groupId>
-      <artifactId>doxia-core</artifactId>
-      <version>1.0-alpha-7</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven.doxia</groupId>
-      <artifactId>doxia-site-renderer</artifactId>
-      <version>1.0-alpha-7</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-      <version>1.0.4</version>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <version>1.2.12</version>
-      <scope>runtime</scope>
-    </dependency>
-  </dependencies>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-plugin-plugin</artifactId>
-        <version>2.2</version>
-      </plugin>
-    </plugins>
-  </reporting>
-
-</project>
diff --git a/maven2-plugins/myfaces-tagdoc-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/tagdoc/TagdocReport.java b/maven2-plugins/myfaces-tagdoc-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/tagdoc/TagdocReport.java
deleted file mode 100644
index 50a8909..0000000
--- a/maven2-plugins/myfaces-tagdoc-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/tagdoc/TagdocReport.java
+++ /dev/null
@@ -1,1441 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.tagdoc;
-
-//import org.apache.maven.doxia.sink.Sink;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.TreeSet;
-
-import javax.xml.namespace.QName;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.apache.commons.digester.AbstractObjectCreationFactory;
-import org.apache.commons.digester.Digester;
-import org.apache.maven.artifact.DependencyResolutionRequiredException;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.reporting.AbstractMavenMultiPageReport;
-import org.apache.maven.reporting.MavenReportException;
-import org.apache.maven.reporting.sink.SinkFactory;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ComponentBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ConverterBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.EventBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.EventRefBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.FacesConfigBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.FacesConfigParser;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.FacetBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.PropertyBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.parse.ValidatorBean;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.ComponentFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.ConverterFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.FilteredIterator;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.PropertyFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.ValidatorFilter;
-import org.apache.myfaces.buildtools.maven2.plugin.faces.util.XIncludeFilter;
-import org.codehaus.doxia.sink.Sink;
-import org.codehaus.doxia.site.renderer.SiteRenderer;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-/**
- * Report for generating JSF tagdoc based on faces-config.xml parsing.
- * Note that this is not really an AbstractMavenMultiPageReport - the
- * secondary pages are manually generated XDoc.  I tried using the true
- * multipage report approach, and ran into Maven bugs (as of Maven 2.0.2,
- * site 2.0b4).
- *
- * @goal tagdoc
- */
-public class TagdocReport extends AbstractMavenMultiPageReport
-{
-  protected void executeReport( Locale locale )
-      throws MavenReportException
-  {
-    // Why the heck doesn't Maven do this for me?
-    SinkFactory factory = new SinkFactory();
-    factory.setSiteRenderer(getSiteRenderer());
-    factory.setSiteDirectory(getOutputDirectory());
-    setSinkFactory(factory);
-    
-    processIndex(project, resourcePath);
-    try
-    {
-      _generateTagDocs();
-    }
-    catch (Exception e)
-    {
-      throw new MavenReportException("Couldn't generate tagdoc", e);
-    }
-  }
-
-  private void _generateTagDocs() throws Exception
-  {
-    FacesConfigBean facesConfig = getFacesConfig();
-    if (!facesConfig.hasComponents())
-    {
-      getLog().info("Nothing to generate - no components found");
-      return;
-    }
-
-
-    Iterator components = facesConfig.components();
-    components = new FilteredIterator(components, new SkipFilter());
-    components = new FilteredIterator(components, new ComponentTagFilter());
-    components = new FilteredIterator(components, new ComponentNamespaceFilter());
-    
-    Iterator validators = facesConfig.validators();
-    validators = new FilteredIterator(validators, new ValidatorTagFilter());
-    validators = new FilteredIterator(validators, new ValidatorNamespaceFilter());
-    
-    Iterator converters = facesConfig.converters();
-    converters = new FilteredIterator(converters, new ConverterTagFilter());
-    converters = new FilteredIterator(converters, new ConverterNamespaceFilter());
-    
-    // =-=AEW Note that only updating out-of-date components, etc. is
-    // permanently tricky, even if we had proper detection in place,
-    // because the index always has to have all docs
-    /*
-    if (!components.hasNext() && !converters.hasNext() && !validators.hasNext())
-    {
-      getLog().info("Nothing to generate - all docs are up to date");
-      return;
-    }
-    */
-
-    Set componentPages = new TreeSet();
-    Set converterPages = new TreeSet();
-    Set validatorPages = new TreeSet();
-    
-    int count = 0;
-    while (components.hasNext())
-    {
-      String pageName = _generateComponentDoc((ComponentBean)components.next());
-      if (pageName != null)
-      {
-        componentPages.add(pageName);
-        count++;
-      }
-    }
-    while (converters.hasNext())
-    {
-      String pageName = _generateConverterDoc((ConverterBean)converters.next());
-      if (pageName != null)
-      {
-        converterPages.add(pageName);
-        count++;
-      }
-    }
-    while (validators.hasNext())
-    {
-      String pageName = _generateValidatorDoc((ValidatorBean)validators.next());
-      if (pageName != null)
-      {
-        validatorPages.add(pageName);
-        count++;
-      }
-    }
-
-
-    Set otherPages = _gatherOtherTags();
-
-    getLog().info("Generated " + count + " page(s)");
-
-    Sink sink = getSink();
-    sink.head();
-    sink.title();
-    sink.text("Tag library documentation");
-    sink.title_();    
-    sink.head_();
-    sink.body();
-
-    sink.sectionTitle1();
-    sink.text("Tag library information");
-    sink.sectionTitle1_();
-    sink.section1();
-
-    for (Iterator i = taglibs.entrySet().iterator(); i.hasNext(); )
-    {
-      Map.Entry entry = (Map.Entry)i.next();
-      sink.paragraph();
-
-      sink.bold();
-      sink.text("Short name:");
-      sink.bold_();
-      sink.nonBreakingSpace();
-      sink.text(entry.getKey().toString());
-      sink.lineBreak();
-
-      sink.bold();
-      sink.text("Namespace:");
-      sink.bold_();
-      sink.nonBreakingSpace();
-      sink.text(entry.getValue().toString());
-      sink.lineBreak();
-
-      sink.paragraph_();
-    }
-
-    sink.section1_();
-
-    _writeIndexSection(sink, componentPages, "Components");
-    _writeIndexSection(sink, converterPages, "Converters");
-    _writeIndexSection(sink, validatorPages, "Validators");
-    _writeIndexSection(sink, otherPages, "Miscellaneous");
-
-    sink.body_();
-  }
-
-  private Set _gatherOtherTags()
-  {
-    TreeSet set = new TreeSet();
-    String subDir = 
-      _platformAgnosticPath(_platformAgnosticPath("xdoc/" + 
-                                                  _DOC_SUBDIRECTORY));
-    File siteSubDir = new File(siteDirectory, subDir);
-    if (siteSubDir.exists())
-    {
-      String[] files = siteSubDir.list();
-      for (int i = 0; i < files.length; i++)
-      {
-        String file = files[i];
-        if (file.endsWith(".xml"))
-        {
-          set.add(file.substring(0, file.length() - 4));
-        }
-      }
-    }
-
-    return set;
-  }
-
-  private String _formatPropList(
-    String[] pList, 
-    String   header)
-  {
-    String[] nullList = {};
-    return _formatPropList(pList, header, nullList);
-  }
-
-  private String _formatPropList(
-    String[] pList, 
-    String   header,
-    String[] ignores)
-  {
-    String formatted = null;
-    if ((pList != null) && (pList.length > 0))
-    {
-      // Don't know how long this will be, but 100 should be plenty.
-      StringBuffer sb = new StringBuffer(100);
-      sb.append("\n");
-      sb.append("<b>");
-      sb.append(header);
-      sb.append(":</b> ");
-
-      boolean gotOne = false;
-
-      for (int arrInd = 0; arrInd < pList.length; arrInd++)
-      {
-        String curStr = pList[arrInd];
-        outer:
-        if (curStr != null)
-        {
-          for (int i = 0; i < ignores.length; i++)
-          {
-            String s = ignores[i];
-            if ((s != null) && (s.equalsIgnoreCase(curStr)))
-            {
-              break outer;
-            }
-          }
-
-          if (gotOne)
-          {
-            sb.append(", ");
-          }
-          gotOne = true;
-          sb.append(curStr);
-        }
-      }
-      if (gotOne)
-      {
-        sb.append("<br/>\n");
-        formatted = sb.toString();
-      }
-    }
-    return formatted;
-  }
-
-  private void _writeIndexSection(Sink sink, Set pages, String title)
-  {
-    if (pages.isEmpty())
-    {
-      return;
-    }
-
-    sink.sectionTitle1();
-    sink.text(title);
-    sink.sectionTitle1_();
-    sink.section1();
-    sink.table();
-    sink.tableRow();
-    sink.tableHeaderCell();
-    sink.text("Tag Name");
-    sink.tableHeaderCell_();
-    sink.tableRow_();
-    
-    Iterator iter = pages.iterator();
-    while (iter.hasNext())
-    {
-      sink.tableRow();
-      sink.tableCell();
-      
-      String name = (String) iter.next();
-      String tagName = "<" + name.replace('_', ':') + ">";
-      
-      sink.link(_DOC_SUBDIRECTORY + "/" + name + ".html");
-      sink.text(tagName);
-      sink.link_();
-      
-      sink.tableCell_();
-      sink.tableRow_();
-    }
-    
-    sink.table_();
-    sink.section1_();
-  }
-
-  public boolean usePageLinkBar()
-  {
-    return false;
-  }
-
-  private String _toPageName(QName qName)
-  {
-    return _getPrefix(qName) + "_" + qName.getLocalPart();
-  }
-  
-  private String _getQualifiedName(QName qName)
-  {
-    return _getPrefix(qName) + ":" + qName.getLocalPart();
-  }
-
-  private String _getPrefix(QName qName)
-  {
-    if ((qName.getPrefix() != null) && !"".equals(qName.getPrefix()))
-    {
-      return qName.getPrefix();
-    }
-    
-    String namespace = qName.getNamespaceURI();
-    if (namespace == null)
-    {
-      return null;
-    }
-
-    for (Iterator i = taglibs.entrySet().iterator(); i.hasNext(); )
-    {
-      Map.Entry entry = (Map.Entry)i.next();
-      if (namespace.equals(entry.getValue()))
-      {
-        return (String) entry.getKey();
-      }
-    }
-
-    return "unknown";
-  }
-
-  private String _generateComponentDoc(ComponentBean component)
-    throws Exception
-  {
-    if (component.getTagName() == null)
-    {
-      return null;
-    }
-    String pageName = _toPageName(component.getTagName());
-
-    File targetDir = new File(outputDirectory.getParentFile(), 
-                              _platformAgnosticPath("generated-site/xdoc/" + 
-                                                      _DOC_SUBDIRECTORY));
-    targetDir.mkdirs();
-    File targetFile = new File(targetDir, pageName + ".xml");
-
-    Writer out = new OutputStreamWriter(new FileOutputStream(targetFile),
-                                        "UTF-8");
-    try
-    {
-      out.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
-      out.write("<document>\n");
-      out.write(" <properties>\n");
-      out.write("  <title>&lt;" + _getQualifiedName(component.getTagName()) + "&gt;</title>\n");
-      out.write(" </properties>\n");
-      out.write(" <body>\n");
-
-      out.write(" <section name=\"Summary\">\n");
-      out.write(" <p>\n");
-      _writeComponentSummary(out, component);
-      out.write(" </p>\n");
-      out.write(" </section>\n");
-      
-      if (component.hasEvents(true))
-      {
-        out.write(" <section name=\"Events\">\n");
-        out.write(" <p>\n");
-        _writeComponentEvents(out, component);
-        out.write(" </p>\n");
-        out.write(" </section>\n");
-      }
-      
-      if (component.hasFacets(true))
-      {
-        out.write(" <section name=\"Supported Facets\">\n");
-        out.write(" <p>\n");
-        _writeComponentFacets(out, component);
-        out.write(" </p>\n");
-        out.write(" </section>\n");
-      }
-      
-      out.write(" <section name=\"Attributes\">\n");
-      _writeComponentAttributes(out, component);
-      out.write(" </section>\n");
-
-      out.write(" </body>\n");
-      out.write("</document>\n");
-    }
-    finally
-    {
-      out.close();
-    }
-
-    return pageName;
-  }
-  
-  private String _generateConverterDoc(ConverterBean converter) throws IOException
-  {
-    if (converter.getTagName() == null)
-    {
-      return null;
-    }
-
-    String pageName = _toPageName(converter.getTagName());
-
-    File targetDir = new File(outputDirectory.getParentFile(), 
-                              _platformAgnosticPath("generated-site/xdoc/" + 
-                                                     _DOC_SUBDIRECTORY));
-    targetDir.mkdirs();
-    File targetFile = new File(targetDir, pageName + ".xml");
-
-    Writer out = new OutputStreamWriter(new FileOutputStream(targetFile),
-                                        "UTF-8");
-    try
-    {
-      out.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
-      out.write("<document>\n");
-      out.write(" <properties>\n");
-      out.write("  <title>&lt;" + _getQualifiedName(converter.getTagName()) + "&gt;</title>\n");
-      out.write(" </properties>\n");
-      out.write(" <body>\n");
-
-      out.write(" <section name=\"Summary\">\n");
-      out.write(" <p>\n");
-      _writeConverterSummary(out, converter);
-      out.write(" </p>\n");
-      out.write(" </section>\n");
-            
-      out.write(" <section name=\"Attributes\">\n");
-      _writeConverterAttributes(out, converter);
-      out.write(" </section>\n");
-
-      out.write(" </body>\n");
-      out.write("</document>\n");
-    }
-    finally
-    {
-      out.close();
-    }
-
-    return pageName;
-  }
-
-  private String _generateValidatorDoc(ValidatorBean validator) throws IOException
-  {
-    if (validator.getTagName() == null)
-    {
-      return null;
-    }
-
-    String pageName = _toPageName(validator.getTagName());
-
-    File targetDir = new File(outputDirectory.getParentFile(), 
-                              _platformAgnosticPath("generated-site/xdoc/" + 
-                                                      _DOC_SUBDIRECTORY));
-    targetDir.mkdirs();
-    File targetFile = new File(targetDir, pageName + ".xml");
-
-    Writer out = new OutputStreamWriter(new FileOutputStream(targetFile),
-                                        "UTF-8");
-    try
-    {
-      out.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
-      out.write("<document>\n");
-      out.write(" <properties>\n");
-      out.write("  <title>&lt;" + _getQualifiedName(validator.getTagName()) + "&gt;</title>\n");
-      out.write(" </properties>\n");
-      out.write(" <body>\n");
-
-      out.write(" <section name=\"Summary\">\n");
-      out.write(" <p>\n");
-      _writeValidatorSummary(out, validator);
-      out.write(" </p>\n");
-      out.write(" </section>\n");
-            
-      out.write(" <section name=\"Attributes\">\n");
-      _writeValidatorAttributes(out, validator);
-      out.write(" </section>\n");
-
-      out.write(" </body>\n");
-      out.write("</document>\n");
-    }
-    finally
-    {
-      out.close();
-    }
-
-    return pageName;
-  }
-
-
-  private void _writeComponentSummary(Writer out, ComponentBean bean) throws IOException
-  {
-    out.write("   <b>Tag name:</b> &lt;" +
-              _getQualifiedName(bean.getTagName()) + "&gt;\n");
-    out.write("   <br/>\n");
-    
-
-    out.write("   <b>UIComponent class:</b> ");
-    String javadocURL = _platformAgnosticPath("../apidocs/" +
-      bean.getComponentClass().replace('.', '/') + ".html");
-    out.write("<a href=\"" + javadocURL + "\">");
-
-    out.write(bean.getComponentClass());
-    out.write("</a>");
-    out.write("\n");
-    out.write("   <br/>\n");
-    out.write("   <b>Component type:</b> " + bean.getComponentType() +  "\n");
-    out.write("   <br/>\n");
-
-    if (_isNamingContainer(bean))
-    {
-      out.write("   <p><b>Naming container:</b>  Yes.  When referring to children of this " +
-                "component (\"partialTriggers\", <code>findComponent()</code>, etc.), " +
-                "you must prefix the child's ID with this component's ID and a colon (':').</p>");
-    }
-      
-    String fmtd = _formatPropList(bean.getUnsupportedAgents(),
-                                  "Unsupported agents",
-                                  _NON_DOCUMENTED_AGENTS);
-    if (fmtd != null)
-    {
-      out.write("   " + fmtd);
-    }
-
-    String doc = bean.getLongDescription();
-    if (doc == null)
-    {
-      doc = bean.getDescription();
-    }
-
-    out.write(_preToSource(doc));
-    out.write("\n");
-  }
-
-
-  private boolean _isNamingContainer(ComponentBean bean)
-  {
-    if (bean.isNamingContainer())
-    {
-      return true;
-    }
-
-    ComponentBean parent = bean.resolveSupertype();
-    if (parent == null)
-    {
-      return false;
-    }
-    return _isNamingContainer(parent);
-  }
-
-  private void _writeValidatorSummary(Writer out, ValidatorBean bean) throws IOException
-  {
-    out.write("   <b>Tag name:</b> &lt;" +
-              _getQualifiedName(bean.getTagName()) + "&gt;\n");
-    out.write("   <br/>\n");
-    
-    out.write("   <br/>\n");
-    out.write("   <b> type:</b> " + bean.getValidatorId() +  "\n");
-    out.write("   <br/>\n");
-
-    String doc = bean.getLongDescription();
-    if (doc == null)
-    {
-      doc = bean.getDescription();
-    }
-
-    out.write(_preToSource(doc));
-    out.write("\n");
-  }
-
-
-  private void _writeConverterSummary(Writer out, ConverterBean bean) throws IOException
-  {
-    out.write("   <b>Tag name:</b> &lt;" +
-              _getQualifiedName(bean.getTagName()) + "&gt;\n");
-    out.write("   <br/>\n");
-    
-    out.write("   <br/>\n");
-    out.write("   <b> type:</b> " + bean.getConverterId() +  "\n");
-    out.write("   <br/>\n");
-
-    String doc = bean.getLongDescription();
-    if (doc == null)
-    {
-      doc = bean.getDescription();
-    }
-
-    out.write(_preToSource(doc));
-    out.write("\n");
-  }
-
-  static private final String _preToSource(String in)
-  {
-    in = in.replaceAll("<pre>", "<source><![CDATA[");
-    in = in.replaceAll("</pre>", "]]></source>");
-    in = in.replaceAll("<html:", "<");
-    in = in.replaceAll("</html:", "</");
-
-    return in;
-  }
-  
-  static private final String _platformAgnosticPath(String path)
-  {
-      return path.replace('/', File.separatorChar);
-  }
-
-
-  private class GroupComparator implements Comparator
-  {
-    public int compare(Object o1, Object o2)
-    {
-      return _getGroupIndex(o1) - _getGroupIndex(o2);
-    }
-
-    public boolean equals(Object o)
-    {
-      return (o instanceof GroupComparator);
-    }
-
-    public int hashCode()
-    {
-      // Yes, this is a very strange hashCode implementation. But the
-      // equals method is also very strange; any two GroupComparator
-      // objects are always equal. Therefore by the java rules, any
-      // two GroupComparator objects must always have the same hashCode.
-      return 17;  // an arbitrary constant.
-    }
-
-    private int _getGroupIndex(Object o)
-    {
-      String s = (o == null) ? null : o.toString();
-
-
-
-
-      if ("message".equalsIgnoreCase(s))
-      {
-        return 0;
-      }
-
-      if ("core".equalsIgnoreCase(s))
-      {
-        return 1;
-      }
-      if ("events".equalsIgnoreCase(s))
-      {
-        return 2;
-      }
-
-      if (s != null)
-      {
-        getLog().warn("UNKNOWN ATTRIBUTE GROUP: " + s);
-      }
-
-      return 3;
-    }
-  }
-
-
-  private void _writeComponentAttributes(Writer out, ComponentBean bean) throws IOException
-  {
-    // Sort the names
-    TreeSet attributes = new TreeSet();
-    Iterator attrs = bean.properties(true);
-    while (attrs.hasNext())
-    {
-      PropertyBean property = (PropertyBean) attrs.next();
-      if (!property.isTagAttributeExcluded())
-      {
-        attributes.add(property.getPropertyName());
-      }
-    }
-
-    // Now get a list of PropertyBeans
-    List list = new ArrayList();
-    Iterator iter = attributes.iterator();
-    while (iter.hasNext())
-    {
-      String attrName = (String) iter.next();
-      list.add(bean.findProperty(attrName, true));
-    }
-    
-
-    TreeSet groups = new TreeSet(new GroupComparator());
-    /* No current support for grouping
-    // Make sure "null" is the representative for unknown groups
-    Iterator iter = attributes.iterator();
-    while (iter.hasNext())
-    {
-      String group = ((AttributeDoc) iter.next()).group;
-      if (group != null)
-      {
-        groups.add(group);
-      }
-    }
-    */
-
-    _writeComponentAttributes(out,
-                              list.iterator(),
-                              bean.getComponentClass(),
-                              groups.isEmpty() ? null : "Ungrouped");
-
-    Iterator groupIter = groups.iterator();
-    while (groupIter.hasNext())
-    {
-      _writeComponentAttributes(out,
-                                list.iterator(),
-                                bean.getComponentClass(),
-                                (String) groupIter.next());
-    }
-
-  }
-
-
-  private void _writeConverterAttributes(Writer out, ConverterBean bean) throws IOException
-  {
-    // Sort the names
-    TreeSet attributes = new TreeSet();
-    Iterator attrs = bean.properties();
-    while (attrs.hasNext())
-    {
-      PropertyBean property = (PropertyBean) attrs.next();
-      if (!property.isTagAttributeExcluded())
-      {
-        attributes.add(property.getPropertyName());
-      }
-    }
-
-    // Now get a list of PropertyBeans
-    List list = new ArrayList();
-    Iterator iter = attributes.iterator();
-    while (iter.hasNext())
-    {
-      String attrName = (String) iter.next();
-      list.add(bean.findProperty(attrName));
-    }
-    
-    _writeComponentAttributes(out,
-                              list.iterator(),
-                              bean.getConverterClass(),
-                              null);
-  }
-
-
-
-  private void _writeValidatorAttributes(Writer out, ValidatorBean bean) throws IOException
-  {
-    // Sort the names
-    TreeSet attributes = new TreeSet();
-    Iterator attrs = bean.properties();
-    while (attrs.hasNext())
-    {
-      PropertyBean property = (PropertyBean) attrs.next();
-      if (!property.isTagAttributeExcluded())
-      {
-        attributes.add(property.getPropertyName());
-      }
-    }
-
-    // Now get a list of PropertyBeans
-    List list = new ArrayList();
-    Iterator iter = attributes.iterator();
-    while (iter.hasNext())
-    {
-      String attrName = (String) iter.next();
-      list.add(bean.findProperty(attrName));
-    }
-    
-    _writeComponentAttributes(out,
-                              list.iterator(),
-                              bean.getValidatorClass(),
-                              null);
-  }
-
-
-
-  private void _writeComponentAttributes(Writer out,
-                                         Iterator attributes,
-                                         String className,
-                                         String group) throws IOException
-  {
-    boolean writtenAnyAttributes = false;
-
-    while (attributes.hasNext())
-    {
-      PropertyBean attr = (PropertyBean) attributes.next();
-
-      /*
-      if ((group == null) || "Ungrouped".equals(group))
-      {
-        if (doc.group != null)
-          continue;
-      }
-      else
-      {
-        if (!group.equalsIgnoreCase(doc.group))
-          continue;
-      }
-      */
-
-      if (!writtenAnyAttributes)
-      {
-        writtenAnyAttributes = true;
-        if (group != null)
-        {
-          String sectionName;
-          if ("events".equalsIgnoreCase(group))
-          {
-            sectionName = "Javascript attributes";
-          }
-          else
-          {
-            sectionName = group + " attributes";
-          }
-
-          out.write("<subsection name=\"" + sectionName + "\">\n");
-        }
-
-        out.write("<table>\n");
-        out.write("<tr>\n");
-        out.write("<th>Name</th>\n");
-        out.write("<th>Type</th>\n");
-        out.write("<th>Supports EL?</th>\n");
-        if (!_attrDocSpansColumns)
-        {
-          out.write("<th>Description</th>\n");
-        }
-        out.write("</tr>\n");
-      }
-
-      String propertyName = attr.getPropertyName();
-      // Quick fix of problems with actionExpression vs. action
-      // actionExpression is the MethodExpression on the component,
-      // but on the tag it's 'action'
-      if ("actionExpression".equals(propertyName))
-      {
-        propertyName = "action";
-      }
-
-      out.write("<tr>\n");
-      out.write("<td>" + propertyName + "</td>");
-      String type = _getDisplayType(className,
-                                    propertyName,
-                                    attr.getPropertyClass());
-
-      out.write("<td>" + type + "</td>");
-
-      String elSupported;
-      // MethodBindings, "binding", and some other attributes
-      // require EL support
-      if (attr.isMethodBinding() || 
-          attr.isMethodExpression() ||
-          "binding".equals(propertyName))
-      {
-        // "action" doesn't require EL; all else do.
-        elSupported = "action".equals(propertyName) ? "Yes" : "Only EL";
-      }
-      else
-      {
-        elSupported = attr.isLiteralOnly() ? "No" : "Yes";
-      }
-
-      out.write("<td>" + elSupported + "</td>");
-
-      if (attr.getDescription()  != null)
-      {
-        String valStr = _formatPropList(attr.getPropertyValues(),
-                                        "Valid Values");
-        String unsupAgentsStr =
-          _formatPropList(attr.getUnsupportedAgents(),
-                          "Not supported on the following agents",
-                          _NON_DOCUMENTED_AGENTS);
-        String unsupRkStr =
-          _formatPropList(attr.getUnsupportedRenderKits(),
-                          "Not supported on the following renderkits");
-
-        if (_attrDocSpansColumns)
-        {
-          out.write("</tr>\n");
-          out.write("<tr>\n");
-          out.write("<td colspan=\"3\">\n");
-        }
-        else
-        {
-          out.write("<td>\n");
-        }
-        
-        //        out.write(EscapeUtils.escapeElementValue(doc.doc));
-        if (valStr != null)
-        {
-          out.write(valStr);
-          out.write("<br/>");
-        }
-        out.write(attr.getDescription());
-        if (unsupAgentsStr != null)
-        {
-          out.write("<br/>");
-          out.write(unsupAgentsStr);
-        }
-        if (unsupRkStr != null)
-        {
-          out.write("<br/>");
-          out.write(unsupRkStr);
-        }
-        //out.write(EscapeUtils.escapeAmpersands(doc.doc));
-        out.write("</td>\n");
-      }
-
-      out.write("</tr>\n");
-    }
-
-    if (writtenAnyAttributes)
-    {
-      out.write("</table>\n");
-      if (group != null)
-      {
-        out.write("</subsection>\n");
-      }
-    }
-  }
-
-  static private String _getDisplayType(String className, String name, String type)
-  {
-    if (type.startsWith("java.lang."))
-    {
-      return type.substring("java.lang.".length());
-    }
-    else if ("binding".equals(name))
-    {
-      StringTokenizer tokens = new StringTokenizer(className, ".", true);
-      String out = "";
-      while (tokens.hasMoreTokens())
-      {
-        String token = tokens.nextToken();
-        out = out + token;
-        // Give ourselves an opportunity for a line break after "component.";
-        if (out.endsWith("component."))
-        {
-          out = out + "<wbr/>";
-        }
-      }
-
-      return out;
-    }
-
-    return type;
-  }
-
-  private void _writeComponentEvents(Writer out, ComponentBean bean) throws IOException
-  {
-    out.write("<table>\n");
-    out.write("<tr>\n");
-    out.write("<th>Type</th>\n");
-    out.write("<th>Phases</th>\n");
-    out.write("<th>Description</th>\n");
-    out.write("</tr>\n");
-
-    Iterator iter = bean.events(true);
-    while (iter.hasNext())
-    {
-      EventRefBean eventRef = (EventRefBean) iter.next();
-      EventBean    event = eventRef.resolveEventType();
-
-      out.write("<tr>\n");
-      out.write("<td>" + event.getEventClass() + "</td>");
-      out.write("<td nowrap=\"nowrap\">");
-      String[] phases = eventRef.getEventDeliveryPhases();
-      for (int i = 0; i < phases.length; i++)
-      {
-        if (i > 0)
-        {
-          out.write(",<br/>");
-        }
-        out.write((String) phases[i]);
-      }
-
-      out.write("</td>");
-      out.write("<td>" + event.getDescription() + "</td>");
-      out.write("</tr>\n");
-    }
-
-    out.write("</table>\n");
-  }
-
-
-
-
-
-  private void _writeComponentFacets(Writer out, ComponentBean bean) throws IOException
-  {
-    // Sort the facets
-    TreeSet facetNames = new TreeSet();
-    Iterator iter = bean.facets(true);
-    while (iter.hasNext())
-    {
-      facetNames.add(((FacetBean) iter.next()).getFacetName());
-    }
-
-    out.write("<table>\n");
-    out.write("<tr>\n");
-    out.write("<th>Name</th>\n");
-    out.write("<th>Description</th>\n");
-    out.write("</tr>\n");
-
-    Iterator nameIter = facetNames.iterator();
-    while (nameIter.hasNext())
-    {
-      String name = (String) nameIter.next();
-      FacetBean facet = bean.findFacet(name, true);
-      out.write("<tr>\n");
-      out.write("<td>" + facet.getFacetName() + "</td>");
-      out.write("<td>");
-      out.write(facet.getDescription());
-      out.write("</td>\n");
-      out.write("</tr>\n");
-    }
-
-    out.write("</table>\n");
-  }
-
-
-
-
-  protected MavenProject getProject()
-  {
-    return project;
-  }
-  
-  protected String getOutputDirectory()
-  {
-    return outputDirectory.getAbsolutePath();
-  }
-
-  protected SiteRenderer getSiteRenderer()
-  {
-    return siteRenderer;
-  }
-
-  public String getName( Locale locale )
-  {
-    return "JSF Tag Documentation";
-  }
-
-  public String getDescription( Locale locale )
-  {
-    return "Documentation for JSF Tags";
-  }
-
-  public String getOutputName()
-  {
-    return "tagdoc";
-  }
-
-  protected void processIndex(
-    MavenProject project,
-    String       resourcePath) throws MavenReportException
-  {
-    _facesConfig = new FacesConfigBean();
-
-    URL[] index = readIndex(project);
-    for (int i=0; i < index.length; i++)
-    {
-      processIndexEntry(index[i]);
-    }
-  }
-
-  protected void processIndexEntry(
-    URL entry) throws MavenReportException
-  {
-    try
-    {
-      new FacesConfigParser().merge(_facesConfig, entry);
-    }
-    catch (MojoExecutionException e)
-    {
-      throw new MavenReportException("Couldn't parse faces config",e);
-    }
-  }
-
-  protected FacesConfigBean getFacesConfig()
-  {
-    return _facesConfig;
-  }
-
-
-  protected List getMasterConfigs(
-    MavenProject project) throws MavenReportException
-  {
-    String resourcePath = "META-INF/maven-faces-plugin/faces-config.xml";
-    return getCompileDependencyResources(project, resourcePath);
-  }
-
-  protected List getCompileDependencyResources(
-    MavenProject project,
-    String       resourcePath) throws MavenReportException
-  {
-    try
-    {
-      ClassLoader cl = createCompileClassLoader(project);
-      Enumeration e = cl.getResources(resourcePath);
-      List urls = new ArrayList();
-      while (e.hasMoreElements())
-      {
-        URL url = (URL)e.nextElement();
-        urls.add(url);
-      }
-      return Collections.unmodifiableList(urls);
-    }
-    catch (IOException e)
-    {
-      throw new MavenReportException("Unable to get resources for path " +
-                                       "\"" + resourcePath + "\"", e);
-    }
-
-  }
-
-  protected URL[] readIndex(
-    MavenProject project) throws MavenReportException
-  {
-    try
-    {
-      // 1. read master faces-config.xml resources
-      List masters = getMasterConfigs(project);
-      if (masters.isEmpty())
-      {
-        getLog().warn("Master faces-config.xml not found");
-        return new URL[0];
-      }
-      else
-      {
-        List entries = new LinkedList();
-
-        SAXParserFactory spf = SAXParserFactory.newInstance();
-        spf.setNamespaceAware(true);
-        // requires JAXP 1.3, in JavaSE 5.0
-        // spf.setXIncludeAware(false);
-
-        for (Iterator i=masters.iterator(); i.hasNext();)
-        {
-          URL url = (URL)i.next();
-          Digester digester = new Digester(spf.newSAXParser());
-          digester.setNamespaceAware(true);
-
-          // XInclude
-          digester.setRuleNamespaceURI(XIncludeFilter.XINCLUDE_NAMESPACE);
-          digester.addCallMethod("faces-config/include", "add", 1);
-          digester.addFactoryCreate("faces-config/include",
-                                    URLCreationFactory.class);
-          digester.addCallParam("faces-config/include", 0, 0);
-
-          digester.push(url);
-          digester.push(entries);
-          digester.parse(url.openStream());
-        }
-
-        return (URL[])entries.toArray(new URL[0]);
-      }
-    }
-    catch (ParserConfigurationException e)
-    {
-      throw new MavenReportException("Failed to parse master config", e);
-    }
-    catch (SAXException e)
-    {
-      throw new MavenReportException("Failed to parse master config", e);
-    }
-    catch (IOException e)
-    {
-      throw new MavenReportException("Failed to parse master config", e);
-    }
-  }
-
-  private ClassLoader createCompileClassLoader(
-    MavenProject project) throws MavenReportException
-  {
-    Thread current = Thread.currentThread();
-    ClassLoader cl = current.getContextClassLoader();
-
-    try
-    {
-      List classpathElements = project.getCompileClasspathElements();
-      if (!classpathElements.isEmpty())
-      {
-        String[] entries = (String[])classpathElements.toArray(new String[0]);
-        URL[] urls = new URL[entries.length];
-        for (int i=0; i < urls.length; i++)
-        {
-          urls[i] = new File(entries[i]).toURL();
-        }
-        cl = new URLClassLoader(urls, cl);
-      }
-    }
-    catch (DependencyResolutionRequiredException e)
-    {
-      throw new MavenReportException("Error calculating scope classpath", e);
-    }
-    catch (MalformedURLException e)
-    {
-      throw new MavenReportException("Error calculating scope classpath", e);
-    }
-
-    return cl;
-  }
-
-  static public class URLCreationFactory extends AbstractObjectCreationFactory
-  {
-    public Object createObject(
-      Attributes attributes) throws MalformedURLException
-    {
-      String href = attributes.getValue("href");
-      if (href == null)
-      {
-        throw new IllegalStateException("Missing href attribute");
-      }
-
-      URL master = (URL)digester.getRoot();
-      return new URL(master, href);
-    }
-  }
-
-  static protected class SkipFilter extends ComponentFilter
-  {
-    protected boolean accept(
-      ComponentBean component)
-    {
-      String componentType = component.getComponentType();
-
-      // always skip API and base class generation
-      return (!componentType.startsWith("javax") &&
-              !componentType.endsWith("Base"));
-    }
-  }
-
-
-
-  private class ComponentNamespaceFilter extends ComponentFilter
-  {
-    public ComponentNamespaceFilter()
-    {
-    }
-
-    protected boolean accept(
-      ComponentBean component)
-    {
-      if (component.getTagName() == null)
-      {
-        return false;
-      }
-
-      return taglibs.containsValue(component.getTagName().getNamespaceURI());
-    }
-  }
-
-  private class ValidatorNamespaceFilter extends ValidatorFilter
-  {
-    public ValidatorNamespaceFilter()
-    {
-    }
-
-    protected boolean accept(
-      ValidatorBean component)
-    {
-      if (component.getTagName() == null)
-      {
-        return false;
-      }
-
-      return taglibs.containsValue(component.getTagName().getNamespaceURI());
-    }
-  }
-
-  private class ConverterNamespaceFilter extends ConverterFilter
-  {
-    public ConverterNamespaceFilter()
-    {
-    }
-
-    protected boolean accept(
-      ConverterBean component)
-    {
-      if (component.getTagName() == null)
-      {
-        return false;
-      }
-
-      return taglibs.containsValue(component.getTagName().getNamespaceURI());
-    }
-  }
-
-
-
-  static final protected class TagAttributeFilter extends PropertyFilter
-  {
-    protected boolean accept(
-      PropertyBean property)
-    {
-      return (!property.isTagAttributeExcluded());
-    }
-  }
-
-  static final protected class ComponentTagFilter extends ComponentFilter
-  {
-    protected boolean accept(
-      ComponentBean component)
-    {
-      return (component.getTagName() != null);
-    }
-  }
-
-  static final protected class ConverterTagFilter extends ConverterFilter
-  {
-    protected boolean accept(
-      ConverterBean converter)
-    {
-      return (converter.getTagClass() != null);
-    }
-  }
-
-  static final protected class ValidatorTagFilter extends ValidatorFilter
-  {
-    protected boolean accept(
-      ValidatorBean validator)
-    {
-      return (validator.getTagClass() != null);
-    }
-  }
-
-
-  private FacesConfigBean _facesConfig;
-
-
-
-  // todo: make this configurable?
-  private boolean _attrDocSpansColumns = false;
-
-  /**
-   * Specifies the directory where the report will be generated
-   *
-   * @parameter default-value="${project.reporting.outputDirectory}"
-   * @required
-   */
-  private File outputDirectory;
-  
-
-  /**
-   * Directory where the original site is present.
-   * (TRIED using ${baseDir}/src/site;  that inserted a 'null' into
-   * the string for some reason.  TRIED using ${siteDirectory},
-   * which was undefined.  TRIED ${project.directory}src/site; which also
-   * inserted a null.  ${project.build.directory}/../src/site seems to work,
-   * though it assumes that ${project.build.directory} is 
-   * ${project.directory}/target.
-   * 
-   * @parameter default-value="${project.build.directory}/../src/site/"
-   * @required
-   */
-  private File siteDirectory;
-
-  /**
-   * @parameter expression="${project}"
-   * @required
-   * @readonly
-   */
-  private MavenProject project;
-
-  /**
-   * @parameter
-   * @required
-   */
-  private Map taglibs;
-
-  /**
-   * @parameter expression="META-INF/maven-faces-plugin/faces-config.xml"
-   * @required
-   * @readonly
-   */
-  private String resourcePath;
-
-
-  /**
-   * @component
-   * @required
-   * @readonly
-   */
-  private SiteRenderer siteRenderer;
-
-  static private final String _DOC_SUBDIRECTORY = "tagdoc";
-  static private final String[] _NON_DOCUMENTED_AGENTS = {"phone", "voice"};
-
-}
diff --git a/maven2-plugins/myfaces-wagon-plugin/LICENSE.txt b/maven2-plugins/myfaces-wagon-plugin/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/maven2-plugins/myfaces-wagon-plugin/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/maven2-plugins/myfaces-wagon-plugin/NOTICE.txt b/maven2-plugins/myfaces-wagon-plugin/NOTICE.txt
deleted file mode 100644
index 0ff2ff9..0000000
--- a/maven2-plugins/myfaces-wagon-plugin/NOTICE.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-=========================================================================
-==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
-==  Version 2.0, in this case for the Apache MyFaces Maven Plugins     ==
-=========================================================================
-
-This product includes software developed by 
-The Apache Software Foundation (http://www.apache.org/).
-
-See the LICENSE.txt file for information on all licenses 
-associated with this software.
diff --git a/maven2-plugins/myfaces-wagon-plugin/pom.xml b/maven2-plugins/myfaces-wagon-plugin/pom.xml
deleted file mode 100644
index 0b7ef0c..0000000
--- a/maven2-plugins/myfaces-wagon-plugin/pom.xml
+++ /dev/null
@@ -1,153 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT 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>
-    <groupId>org.apache.myfaces.buildtools</groupId>
-    <artifactId>myfaces-plugin-parent</artifactId>
-    <version>1.0.2</version>
-  </parent>
-
-
-  <groupId>org.apache.myfaces.buildtools</groupId>
-  <artifactId>myfaces-wagon-plugin</artifactId>
-  <version>1.0.1-SNAPSHOT</version>
-  <packaging>maven-plugin</packaging>
-  <name>Apache MyFaces Buildtools Maven2 Wagon Plugin</name>
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/myfaces/maven/trunk/wagon-maven-plugin</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/myfaces/maven/trunk/wagon-maven-plugin</developerConnection>
-    <url>http://svn.apache.org/viewcvs.cgi/myfaces/maven/trunk/wagon-maven-plugin</url>
-  </scm>
-  <build>
-    <extensions>
-      <extension>
-        <groupId>org.apache.maven.wagon</groupId>
-        <artifactId>wagon-ssh-external</artifactId>
-        <version>1.0-alpha-5</version>
-      </extension>
-    </extensions>
-  </build>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId>
-      <version>2.0.2</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-      <version>2.0.2</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-artifact</artifactId>
-      <version>2.0.2</version>
-    </dependency>
-  </dependencies>
-
-  <distributionManagement>
-    <repository>
-      <id>myfaces-staging</id>
-      <name>Apache MyFaces Staging Repository</name>
-      <url>scpexe://people.apache.org/www/people.apache.org/builds/myfaces/m2-staging-repository</url>
-    </repository>
-    <snapshotRepository>
-      <uniqueVersion>false</uniqueVersion>
-      <id>apache-maven-snapshots</id>
-      <name>Apache Maven Snapshot Repository</name>
-      <url>scpexe://people.apache.org/www/people.apache.org/repo/m2-snapshot-repository</url>
-    </snapshotRepository>
-  </distributionManagement>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jxr-plugin</artifactId>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-javadoc-plugin</artifactId>
-        <configuration>
-          <links>
-            <link>http://java.sun.com/j2ee/1.4/docs/api</link>
-            <link>http://java.sun.com/j2se/1.5.0/docs/api</link>
-            <link>http://jakarta.apache.org/commons/collections/apidocs-COLLECTIONS_3_0/</link>
-            <link>http://jakarta.apache.org/commons/dbcp/apidocs/</link>
-            <link>http://jakarta.apache.org/commons/fileupload/apidocs/</link>
-            <link>http://jakarta.apache.org/commons/httpclient/apidocs/</link>
-            <link>http://jakarta.apache.org/commons/logging/apidocs/</link>
-            <link>http://jakarta.apache.org/commons/pool/apidocs/</link>
-            <link>http://www.junit.org/junit/javadoc/</link>
-            <link>http://logging.apache.org/log4j/docs/api/</link>
-            <link>http://jakarta.apache.org/regexp/apidocs/</link>
-            <link>http://jakarta.apache.org/velocity/api/</link>
-          </links>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>taglist-maven-plugin</artifactId>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-plugin-plugin</artifactId>
-      </plugin>
-    </plugins>
-  </reporting>
-
-  <profiles>
-    <profile>
-      <id>sign-artifacts</id>
-      <activation>
-        <property>
-          <name>performRelease</name>
-          <value>true</value>
-        </property>
-      </activation>
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-gpg-plugin</artifactId>
-            <executions>
-              <execution>
-                <id>sign-artifacts</id>
-                <phase>verify</phase>
-                <goals>
-                  <goal>sign</goal>
-                </goals>
-              </execution>
-            </executions>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-  </profiles>
-
-</project>
diff --git a/maven2-plugins/myfaces-wagon-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/wagon/WagonMojo.java b/maven2-plugins/myfaces-wagon-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/wagon/WagonMojo.java
deleted file mode 100644
index 0be7fe7..0000000
--- a/maven2-plugins/myfaces-wagon-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/wagon/WagonMojo.java
+++ /dev/null
@@ -1,158 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.wagon;
-
-import java.io.File;
-
-import org.apache.maven.artifact.manager.WagonManager;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.wagon.ConnectionException;
-import org.apache.maven.wagon.ResourceDoesNotExistException;
-import org.apache.maven.wagon.TransferFailedException;
-import org.apache.maven.wagon.UnsupportedProtocolException;
-import org.apache.maven.wagon.Wagon;
-import org.apache.maven.wagon.authentication.AuthenticationException;
-import org.apache.maven.wagon.authorization.AuthorizationException;
-import org.apache.maven.wagon.observers.Debug;
-import org.apache.maven.wagon.repository.Repository;
-
-
-/**
- * Deploys the content of a directory using scp/file protocol.
- * For scp protocol, files are packaged into zip archive,
- * then archive is transfred to remote host, nextly it is un-archived.
- * This method of deployment should normally be much faster
- * then making file by file copy.  For file protocol, the files are copied
- * directly to the destination directory.
- *
- * @version 
- * @goal deploy
- */
-public class WagonMojo extends AbstractMojo
-{
-    /**
-     * Directory containing the files for wagon.
-     *
-     * @parameter
-     * @required
-     */
-    private File inputDirectory;
-
-    /**
-      * Specifies the server id.
-      *
-      * @parameter
-      * * @required
-      */
-    private String id;
-
-    /**
-     * The full URL of the server.
-     *
-     * @parameter
-     * @required
-     */
-    private String url;
-    /**
-     * @parameter expression="${project}"
-     * @required
-     * @readonly
-     */
-    private MavenProject project;
-
-    /**
-     * @component
-     */
-    private WagonManager wagonManager;
-
-    public void execute()
-        throws MojoExecutionException
-    {
-        if ( !inputDirectory.exists() )
-        {
-            throw new MojoExecutionException( "The inputDirectory does not exist" );
-        }
-
-        Repository repository = new Repository( id, url );
-
-
-        Wagon wagon = null;
-        try
-        {
-            wagon = wagonManager.getWagon( repository.getProtocol() );
-        }
-        catch ( UnsupportedProtocolException e )
-        {
-            throw new MojoExecutionException( "Unsupported protocol: '" + repository.getProtocol() + "'", e );
-        }
-
-        if ( !wagon.supportsDirectoryCopy() )
-        {
-            throw new MojoExecutionException(
-                "Wagon protocol '" + repository.getProtocol() + "' doesn't support directory copying" );
-        }
-
-        try
-        {
-            Debug debug = new Debug();
-
-            wagon.addSessionListener( debug );
-
-            wagon.addTransferListener( debug );
-
-            wagon.connect( repository, wagonManager.getAuthenticationInfo( id ) );
-
-            wagon.putDirectory( inputDirectory, "." );
-
-        }
-        catch ( ResourceDoesNotExistException e )
-        {
-            throw new MojoExecutionException( "Error uploading", e );
-        }
-        catch ( TransferFailedException e )
-        {
-            throw new MojoExecutionException( "Error uploading", e );
-        }
-        catch ( AuthorizationException e )
-        {
-            throw new MojoExecutionException( "Error uploading", e );
-        }
-        catch ( ConnectionException e )
-        {
-            throw new MojoExecutionException( "Error uploading", e );
-        }
-        catch ( AuthenticationException e )
-        {
-            throw new MojoExecutionException( "Error uploading", e );
-        }
-        finally
-        {
-            try
-            {
-                wagon.disconnect();
-            }
-            catch ( ConnectionException e )
-            {
-                getLog().error( "Error disconnecting wagon - ignored", e );
-            }
-        }
-    }
-}
diff --git a/maven2-plugins/myfaces-wagon-plugin/src/main/resources/META-INF/LICENSE.txt b/maven2-plugins/myfaces-wagon-plugin/src/main/resources/META-INF/LICENSE.txt
deleted file mode 100644
index c6055ec..0000000
--- a/maven2-plugins/myfaces-wagon-plugin/src/main/resources/META-INF/LICENSE.txt
+++ /dev/null
@@ -1,174 +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.
diff --git a/maven2-plugins/myfaces-wagon-plugin/src/main/resources/META-INF/NOTICE.txt b/maven2-plugins/myfaces-wagon-plugin/src/main/resources/META-INF/NOTICE.txt
deleted file mode 100644
index 45f9450..0000000
--- a/maven2-plugins/myfaces-wagon-plugin/src/main/resources/META-INF/NOTICE.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-Apache MyFaces
-Copyright 2004-2007 The Apache Software Foundation
-
-This product includes software developed by:
-The Apache Software Foundation (http://www.apache.org/).
-
-------------------------------------------------------------------------
-See the file LICENSE.txt
-------------------------------------------------------------------------
diff --git a/maven2-plugins/myfaces-wagon-plugin/src/site/apt/usage.apt b/maven2-plugins/myfaces-wagon-plugin/src/site/apt/usage.apt
deleted file mode 100644
index dd7a317..0000000
--- a/maven2-plugins/myfaces-wagon-plugin/src/site/apt/usage.apt
+++ /dev/null
@@ -1,41 +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.
-
-           -----
-           Usage
-           -----
-
-Usage
-
-  The plugin offers a goal for transport the content of a directory with wagon.
-
------------------------------------------------------------------------------------
-  <build>
-    <plugins>
-      ...
-     <plugin>
-        <groupId>org.apache.myfaces.maven</groupId>
-        <artifactId>wagon-maven-plugin</artifactId>
-
-        <configuration>
-          <id>myfaces-nightly-builds</id>
-          <url>scpexe://minotaur.apache.org/www/people.apache.org/builds/myfaces/nightly</url>
-          <inputDirectory>target/assembly/out</inputDirectory>
-        </configuration>
-      </plugin>
-      ...
-    </plugins>
-  </build>
------------------------------------------------------------------------------------
\ No newline at end of file
diff --git a/maven2-plugins/myfaces-wagon-plugin/src/site/site.xml b/maven2-plugins/myfaces-wagon-plugin/src/site/site.xml
deleted file mode 100644
index 2181bd7..0000000
--- a/maven2-plugins/myfaces-wagon-plugin/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<!--
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
--->
-
-<project name="Wagon Maven Plugin">
-  <bannerLeft>
-    <name>MyFaces</name>
-    <src>images/myfaces-logo.png</src>
-    <href>http://myfaces.apache.org/</href>
-  </bannerLeft>
-  <publishDate format="dd MMM yyyy" />
-  <body>
-    <links>
-      <item name="Maven 2" href="http://maven.apache.org/maven2/"/>
-      <item name="MyFaces" href="http://myfaces.apache.org"/>
-    </links>
-
-    <menu name="Overview">
-      <item name="Introduction" href="index.html"/>
-      <item name="Goals" href="plugin-info.html"/>
-      <item name="Usage" href="usage.html"/>
-    </menu>
-    ${reports}
-  </body>
-</project>
diff --git a/maven2-plugins/myfaces-xrts-plugin/LICENSE.txt b/maven2-plugins/myfaces-xrts-plugin/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/maven2-plugins/myfaces-xrts-plugin/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/maven2-plugins/myfaces-xrts-plugin/NOTICE.txt b/maven2-plugins/myfaces-xrts-plugin/NOTICE.txt
deleted file mode 100644
index fa3dbd6..0000000
--- a/maven2-plugins/myfaces-xrts-plugin/NOTICE.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-=========================================================================
-==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
-==  Version 2.0, in this case for the Apache MyFaces Maven Plugins     ==
-=========================================================================
-
-This product includes software developed by 
-The Apache Software Foundation (http://www.apache.org/).
-
-Portions of this software were originally based on the following:
-
- - software copyright (c) 2000-2006, Oracle Corp, <http://www.oracle.com/>.
-and are licensed to the Apache Software Foundation under the 
-"Software Grant and Corporate Contribution License Agreement"
-
-See the LICENSE.txt file for information on all licenses 
-associated with this software.
diff --git a/maven2-plugins/myfaces-xrts-plugin/pom.xml b/maven2-plugins/myfaces-xrts-plugin/pom.xml
deleted file mode 100644
index 285173d..0000000
--- a/maven2-plugins/myfaces-xrts-plugin/pom.xml
+++ /dev/null
@@ -1,86 +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.
--->
-
-<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>
-    <groupId>org.apache.myfaces.buildtools</groupId>
-    <artifactId>myfaces-plugin-parent</artifactId>
-    <version>1.0.2</version>
-  </parent>
-
-  <groupId>org.apache.myfaces.buildtools</groupId>
-  <artifactId>myfaces-xrts-plugin</artifactId>
-  <version>1.0.1-SNAPSHOT</version>
-  <packaging>maven-plugin</packaging>
-  <name>Apache MyFaces Buildtools Maven2 XRTS Plugin</name>
-
-  <build>
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-compiler-plugin</artifactId>
-          <inherited>true</inherited>
-          <configuration>
-            <source>1.5</source>
-            <target>1.5</target>
-            <showWarnings>true</showWarnings>
-            <compilerArgument>-Xlint:all,-serial,-fallthrough</compilerArgument>
-          </configuration>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-plugin-plugin</artifactId>
-        <version>2.2</version>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-      <version>2.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId>
-      <version>2.0</version>
-    </dependency>
-  </dependencies>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-plugin-plugin</artifactId>
-        <version>2.2</version>
-      </plugin>
-    </plugins>
-  </reporting>
-</project>
diff --git a/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/AbstractGenerateSourcesMojo.java b/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/AbstractGenerateSourcesMojo.java
deleted file mode 100644
index a2c12f5..0000000
--- a/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/AbstractGenerateSourcesMojo.java
+++ /dev/null
@@ -1,220 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.xrts;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-
-import java.util.Arrays;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-
-import org.codehaus.plexus.util.DirectoryScanner;
-
-import org.xml.sax.InputSource;
-
-/**
- * @version $Id$
- * @phase generate-resources
- * @description Goal which generates the XRTS Bundles
- */
-abstract public class AbstractGenerateSourcesMojo extends AbstractMojo
-{
-  /**
-   * Execute the Mojo.
-   */
-  public void execute() throws MojoExecutionException
-  {
-    try
-    {
-      generateBundles();
-    }
-    catch (IOException e)
-    {
-      throw new MojoExecutionException(e.getMessage());
-    }
-  }
-
-  abstract protected String getTargetType();
-
-  abstract protected String[] getDefaultLocales();
-
-  abstract protected String[] getExcludes();
-
-  abstract protected File getSourceDirectory();
-
-  abstract protected File getTargetDirectory();
-
-  abstract protected void addCompileSourceRoot() throws IOException;
-
-  private void generateBundles() throws IOException, MojoExecutionException
-  {
-    File sourceDirectory = getSourceDirectory();
-    if (sourceDirectory.exists())
-    {
-      // Include generated sources in compilation
-      addCompileSourceRoot();
-
-      // Scan for .xrts sources
-      DirectoryScanner scanner = new DirectoryScanner();
-      scanner.setBasedir(sourceDirectory);
-      scanner.addDefaultExcludes();
-      String[] excludes = getExcludes();
-      scanner.setExcludes(excludes);
-      scanner.setIncludes(new String[] { "**/*.xrts" });
-      scanner.scan();
-
-      String[] xrtsFiles = scanner.getIncludedFiles();
-      if (xrtsFiles.length > 0)
-      {
-        RTSWriter writer = getRTSWriter();
-        Map params = new HashMap();
-
-        List dirtyXRTS = new LinkedList(Arrays.asList(xrtsFiles));
-        SAXParserFactory factory = SAXParserFactory.newInstance();
-        factory.setValidating(false);
-
-        for (Iterator i=dirtyXRTS.iterator(); i.hasNext();)
-        {
-          String xrtsFile = (String)i.next();
-          File targetFile = getTargetFile(xrtsFile);
-          if (targetFile.exists())
-          {
-            File sourceFile = getSourceFile(xrtsFile);
-            if (targetFile.lastModified() >= sourceFile.lastModified())
-            {
-              i.remove();
-            }
-          }
-        }
-
-        if (dirtyXRTS.isEmpty())
-        {
-          getLog().info("Nothing to generate - all XRTS bundles are up to date");
-        }
-        else
-        {
-          getLog().info("Generating " + dirtyXRTS.size() + " XRTS bundles to " + getTargetDirectory());
-
-          for (Iterator i=dirtyXRTS.iterator(); i.hasNext();)
-          {
-            String xrtsFile = (String)i.next();
-            File sourceFile = getSourceFile(xrtsFile);
-            File targetFile = getTargetFile(xrtsFile);
-            String baseName = getBasename(xrtsFile);
-
-            params.put("outFile", targetFile);
-            params.put("outName", baseName);
-            params.put("srcName", baseName);
-            params.put("quietMode", Boolean.TRUE);
-            params.put("defaultLocales", getDefaultLocales());
-            InputSource source = new InputSource(new FileInputStream(sourceFile));
-            // setup relative systemId resolution for local rts.dtd files.
-            source.setSystemId(sourceFile.getParentFile().toURL().toString());
-
-            try
-            {
-              if (targetFile.exists())
-              {
-                targetFile.delete();
-              }
-
-              SAXParser parser = factory.newSAXParser();
-              targetFile.getParentFile().mkdirs();
-              XRTSGenerator.generate(parser, source, writer, params);
-              targetFile.setReadOnly();
-            }
-            catch (Throwable t)
-            {
-              throw new MojoExecutionException(t.getMessage());
-            }
-          }
-        }
-      }
-    }
-  }
-
-  private RTSWriter getRTSWriter() throws IOException, MojoExecutionException
-  {
-    String implClassName;
-
-    String targetType = getTargetType();
-    if (targetType.startsWith("class:"))
-    {
-      implClassName = targetType.substring("class:".length());
-    }
-    else
-    {
-      if ("list".equals(targetType))
-      {
-        return new ListRTSWriter();
-      }
-      throw new MojoExecutionException("Unknown bundle type: " + targetType);
-    }
-
-    try
-    {
-      Class implClass = Class.forName(implClassName);
-      return (RTSWriter)implClass.newInstance();
-    }
-    catch (InstantiationException e)
-    {
-      e.printStackTrace();
-      throw new MojoExecutionException(e.getMessage());
-    }
-    catch (ClassNotFoundException e)
-    {
-      e.printStackTrace();
-      throw new MojoExecutionException(e.getMessage());
-    }
-    catch (IllegalAccessException e)
-    {
-      e.printStackTrace();
-      throw new MojoExecutionException(e.getMessage());
-    }
-  }
-
-  private File getSourceFile(String xrtsFilename)
-  {
-    return new File(getSourceDirectory(), xrtsFilename);
-  }
-
-  private String getBasename(String sourcePath)
-  {
-    int start = sourcePath.lastIndexOf(File.separatorChar) + 1;
-    return sourcePath.substring(start, sourcePath.length() - ".xrts".length());
-  }
-
-  private File getTargetFile(String sourcePath)
-  {
-    String basename = sourcePath.substring(0, sourcePath.length() - ".xrts".length());
-    String targetPath = basename + ".java";
-    return new File(getTargetDirectory(), targetPath);
-  }
-}
diff --git a/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/GenerateSourcesMojo.java b/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/GenerateSourcesMojo.java
deleted file mode 100644
index 455fd62..0000000
--- a/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/GenerateSourcesMojo.java
+++ /dev/null
@@ -1,98 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.xrts;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.apache.maven.project.MavenProject;
-
-/**
- * @version $Id$
- * @goal generate-sources
- * @phase generate-sources
- * @description Goal which generates the XRTS Bundles
- */
-public class GenerateSourcesMojo extends AbstractGenerateSourcesMojo
-{
-  /**
-   * @parameter expression="${project}"
-   * @required
-   * @readonly
-   */
-  private MavenProject project;
-
-  /**
-   * @parameter expression="list"
-   * @required
-   */
-  private String targetType;
-
-  /**
-   * @parameter
-   */
-  private String[] defaultLocales;
-
-  /**
-   * @parameter
-   */
-  private String[] excludes;
-
-  /**
-   * @parameter expression="src/main/xrts"
-   * @required
-   */
-  private File sourceDirectory;
-
-  /**
-   * @parameter expression="${project.build.directory}/maven-xrts-plugin/main/java"
-   * @required
-   */
-  private File targetDirectory;
-
-  protected String[] getDefaultLocales()
-  {
-    return defaultLocales;
-  }
-
-  protected String[] getExcludes()
-  {
-    return excludes;
-  }
-
-  protected void addCompileSourceRoot() throws IOException
-  {
-    project.addCompileSourceRoot(targetDirectory.getCanonicalPath());
-  }
-
-  protected String getTargetType()
-  {
-    return targetType;
-  }
-
-  protected File getSourceDirectory()
-  {
-    return sourceDirectory;
-  }
-
-  protected File getTargetDirectory()
-  {
-    return targetDirectory;
-  }
-}
diff --git a/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/GenerateTestSourcesMojo.java b/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/GenerateTestSourcesMojo.java
deleted file mode 100644
index 96a3ce0..0000000
--- a/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/GenerateTestSourcesMojo.java
+++ /dev/null
@@ -1,98 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.xrts;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.apache.maven.project.MavenProject;
-
-/**
- * @version $Id$
- * @goal generate-test-sources
- * @phase generate-test-sources
- * @description Goal which generates the XRTS Bundles
- */
-public class GenerateTestSourcesMojo extends AbstractGenerateSourcesMojo
-{
-  /**
-   * @parameter expression="${project}"
-   * @required
-   * @readonly
-   */
-  private MavenProject project;
-
-  /**
-   * @parameter expression="list"
-   * @required
-   */
-  private String targetType;
-
-  /**
-   * @parameter
-   */
-  private String[] defaultLocales;
-
-  /**
-   * @parameter
-   */
-  private String[] testExcludes;
-
-  /**
-   * @parameter expression="src/test/xrts"
-   * @required
-   */
-  private File testSourceDirectory;
-
-  /**
-   * @parameter expression="${project.build.directory}/maven-xrts-plugin/test/java"
-   * @required
-   */
-  private File targetDirectory;
-
-  protected String[] getDefaultLocales()
-  {
-    return defaultLocales;
-  }
-
-  protected String[] getExcludes()
-  {
-    return testExcludes;
-  }
-
-  protected void addCompileSourceRoot() throws IOException
-  {
-    project.addTestCompileSourceRoot(targetDirectory.getCanonicalPath());
-  }
-
-  protected String getTargetType()
-  {
-    return targetType;
-  }
-
-  protected File getSourceDirectory()
-  {
-    return testSourceDirectory;
-  }
-
-  protected File getTargetDirectory()
-  {
-    return targetDirectory;
-  }
-}
diff --git a/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/ListRTSWriter.java b/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/ListRTSWriter.java
deleted file mode 100644
index 736725e..0000000
--- a/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/ListRTSWriter.java
+++ /dev/null
@@ -1,186 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.xrts;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.PrintWriter;
-import java.util.Map;
-//import java.util.StringTokenizer;
-
-
-/**
- * The <code>ListRTSWriter</code> class is an implementation of the
- * <code>RTSWriter</code> interface used to create a Sun
- * <code>ListResourceBundle</code> file.
- *
- * @version $Name:  $ ($Revision: 1.11 $) $Date: 2002/02/27 17:18:47 $
- * @since RTS 2.0
- */
-public class ListRTSWriter implements RTSWriter
-{
-
-  /**
-   * Empty constructor for the <code>ListResourceBundle</code> implementation
-   *
-   */
-  public ListRTSWriter()
-  {
-  }
-
-  /**
-   * <code>RTSWriter</code> method implementation to write the header of the
-   * <code>ListResourceBundle</code> file.
-   *
-   * @param parms a <code>Map</code> of command line parameters.
-   * @param meta a <code>Map</code> of parsed non-resource data
-   * (e.g., authors).
-   */
-  public void startBundle(Map parms, Map meta)
-    throws Throwable
-  {
-    File outFile = (File)parms.get("outFile");
-    String outName = (String)parms.get("outName");
-    String srcName = (String)parms.get("srcName");
-
-    Boolean b = (Boolean)parms.get("quietMode");
-    boolean quietMode = b.booleanValue();
-    if (!quietMode)
-    {
-      System.out.println("  " + outFile);
-    }
-
-    _pw = new PrintWriter(new BufferedWriter(new FileWriter(outFile)));
-
-    _pw.println("// Do not edit this file!");
-    _pw.println("// This file has been automatically generated.");
-
-    String rtsFileType = "xrts";
-    if (meta != null)
-    {
-      rtsFileType = (String)meta.get("fileType");
-    }
-    _pw.println("// Edit " + srcName + "." + rtsFileType + " and run the " +
-      rtsFileType.toUpperCase() + "MakeBundle tool instead.");
-    _pw.println("// ");
-
-    String packageName = (String)parms.get("pkgName");
-    boolean validPackage = false;
-    if (packageName == null)
-    {
-      if (meta != null)
-      {
-        if (meta.get("package") != null)
-        {
-          packageName = (String)meta.get("package");
-        }
-      }
-    }
-
-    if (packageName != null &&
-      (!packageName.equals("") || !packageName.trim().equals("")))
-    {
-      _pw.println("package " + packageName + ";");
-      _pw.println("");
-      validPackage = true;
-    }
-
-    _pw.println("import java.util.ListResourceBundle;");
-
-    writeImports(parms, meta);
-
-    _pw.println("");
-    _pw.println("public class " + outName + " extends ListResourceBundle {");
-    _pw.println("  @Override");
-    _pw.println("  public Object[][] getContents() {");
-    _pw.println("    return new Object[][] {");
-
-    if (outName.indexOf('_') < 0)
-    {
-      // This is the base bundle. If any default locales are requested,
-      // they'll extend this bundle. Create them here because we have all
-      // the needed info.
-      String[] locales = (String[]) parms.get("defaultLocales");
-      File targDir = outFile.getParentFile();
-      if ((locales != null) && (targDir != null))
-      {
-        for (int l = 0; l < locales.length; l++)
-        {
-          String cName = outName + '_' + locales[l];
-          File locF = new File(targDir, cName + ".java");
-          
-          PrintWriter locWri; 
-          locWri = new PrintWriter(new BufferedWriter(new FileWriter(locF)));
-
-          locWri.println("// Do not edit this file!");
-          locWri.println("// This file has been automatically generated.");
-
-          if (validPackage)
-          {
-            locWri.println("package " + packageName + ";");
-            locWri.println("");
-          }
-          locWri.println("public class " + cName + " extends " + outName);
-          locWri.println("{");
-          locWri.println("}");
-          locWri.close();
-        }
-      }
-    }
-    
-  }
-
-  protected void writeImports(Map parms, Map meta)
-     throws Throwable
-  {
-  }
-
-  public void writeString(Map parms, Map meta, String key,
-    String value) throws Throwable
-  {
-    _pw.println("    {\"" + UnicodeEscapes.convert(key) + "\", \"" +
-                UnicodeEscapes.convert(value) + "\"},");
-  }
-
-
-  /**
-   * <code>RTSWriter</code> method implementation to close the file stream
-   * required for the <code>ListResourceBundle</code>.  Before closing, this
-   * method also writes the footer portions of the file.  The footer portions
-   * consist of little more than closing braces.
-   *
-   * @param meta a <code>Map</code> of parsed non-resource data
-   * (e.g., authors).
-   */
-  public void endBundle(Map parms, Map meta) throws Throwable
-  {
-    _pw.println("    };");
-    _pw.println("  }");
-    _pw.println("}");
-    _pw.close();
-  }
-
-  protected PrintWriter getOut()
-  {
-    return _pw;
-  }
-
-  private PrintWriter _pw;
-}
diff --git a/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/RTSWriter.java b/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/RTSWriter.java
deleted file mode 100644
index 264c219..0000000
--- a/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/RTSWriter.java
+++ /dev/null
@@ -1,82 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.xrts;
-
-import java.util.Map;
-
-/**
- * The <code>RTSWriter</code> interface defines methods for writing the
- * header, body, and footer of various output implementations. <p>
- *
- * The methods <code>startBundle</code> and <code>endBundle</code> write the
- * header and footer portions to the output.  The methods for writing the
- * body are <code>writeString</code>, <code>writeStringArray</code>, and
- * <code>writeMap</code>. These methods are supplied with data parsed
- * by the XML-based RTS file <code>XRTSParser</code> or the
- * <code>RTSProperties</code> parser.<p>
- *
- * @see ListRTSWriter
- *
- * @version $Name:  $ ($Revision: 1.7 $) $Date: 2001/04/09 23:22:22 $
- */
-public interface RTSWriter
-{
-
-  /**
-   * Writes the <file or other output header(s).
-   *
-   * @param parms a <code>Map</code> of command line parameters.
-   * @param meta a <code>Map</code> of parsed non-resource data
-   * (e.g., package).
-   */
-  public void startBundle(Map parms, Map meta)
-    throws Throwable;
-
-  /**
-   * Writes a <code>String</code> to the implementation output. <p>
-   *
-   * This is the typical case use.  A single <code>String</code> key associated
-   * with a single <code>String</code> value forming a key/value pair (kvp).
-   * Note that the other two body methods, <code>writeStringArray</code> and
-   * <code>writeMap</code> both support a single <code>String</code>
-   * key associated with multiple values. <p>
-   *
-   * A key/value pair may have associated attributes in the RTS file.
-   * In this method, these are received from the XML parser as a
-   * <code>Map</code>. <p>
-   *
-   * @param parms a <code>Map</code> of command line parameters
-   * @param meta a <code>Map</code> of parsed non-resource data
-   * (e.g., package).
-   * @param key a <code>String</code> key.
-   * @param value a <code>String</code> value.
-   */
-  public void writeString(Map parms, Map meta, String key,
-    String value) throws Throwable;
-
-  /**
-   * Writes the file or other output footer(s).
-   *
-   * @param parms a <code>Map</code> of command line parameters.
-   * @param meta a <code>Map</code> of parsed non-resource data
-   * (e.g., package).
-   */
-  public void endBundle(Map parms, Map meta) throws Throwable;
-
-}
diff --git a/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/UnicodeEscapes.java b/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/UnicodeEscapes.java
deleted file mode 100644
index 69e76c2..0000000
--- a/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/UnicodeEscapes.java
+++ /dev/null
@@ -1,106 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.xrts;
-
-/**
- * The <code>UnicodeEscapes</code> class converts bytes and characters outside
- * the ASCII character set to Java usable '\\u' Unicode escapes characters.  This
- * is a runtime version of native2ascii more or less.
- *
- * @version $Name:  $ ($Revision: 1.5 $) $Date: 2002/02/27 17:18:16 $
- */
-public final class UnicodeEscapes
-{
-
-  private UnicodeEscapes()
-  {
-  }
-
-  static public String convert(String s)
-  {
-    StringBuffer buffer = new StringBuffer(s.length());
-    for(int i = 0; i < s.length(); i++)
-    {
-      char c = s.charAt(i);
-      if (c < 128)
-      {
-        switch (c)
-        {
-        case '\b':
-          buffer.append("\\b");
-          break;
-        case '\t':
-          buffer.append("\\t");
-          break;
-        case '\n':
-          buffer.append("\\n");
-          break;
-        case '\f':
-          buffer.append("\\f");
-          break;
-        case '\r':
-          buffer.append("\\r");
-          break;
-        case '\"':
-          buffer.append("\\\"");
-          break;
-        case '\'':
-          buffer.append("\\\'");
-          break;
-        case '\\':
-          buffer.append("\\\\");
-          break;
-        default:
-          buffer.append(c);
-          break;
-        }
-      }
-      else
-      {
-        buffer.append("\\u");
-        buffer.append(_HEX[(c>>12)& 0x0f]);
-        buffer.append(_HEX[(c>>8)& 0x0f]);
-        buffer.append(_HEX[(c>>4)& 0x0f]);
-        buffer.append(_HEX[c & 0x0f]);
-      }
-    }
-    return buffer.toString();
-  }
-
-//  String byteToHex(byte b) {
-//    // Returns hex String representation of byte b
-//    char hexDigit[] = {
-//       '0', '1', '2', '3', '4', '5', '6', '7',
-//       '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
-//    };
-//    char[] array = { hexDigit[(b >> 4) & 0x0f], hexDigit[b & 0x0f] };
-//    return new String(array);
-//  }
-
-//  String charToHex(char c) {
-//    // Returns hex String representation of char c
-//    byte hi = (byte) (c >>> 8);
-//    byte lo = (byte) (c & 0xff);
-//    return byteToHex(hi) + byteToHex(lo);
-//  }
-
-  private static final String[] _HEX =
-    {"0", "1", "2", "3", "4", "5", "6", "7",
-     "8", "9", "a", "b", "c", "d", "e", "f"};
-}
diff --git a/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/XRTSGenerator.java b/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/XRTSGenerator.java
deleted file mode 100644
index 4e9457d..0000000
--- a/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/XRTSGenerator.java
+++ /dev/null
@@ -1,61 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.xrts;
-
-import java.util.Map;
-
-import javax.xml.parsers.SAXParser;
-
-import org.xml.sax.InputSource;
-
-/**
- * The <code>XRTSGenerator</code> class is a online facility (as opposed to the
- * command line utility <code>XRTSMakeBundle</code>) for parsing and building
- * XML-based RTS files to the given implementation output. <p>
- *
- * @version $Name:  $ ($Revision: 1.1 $) $Date: 2001/07/09 18:15:53 $
- * @since RTS 2.0
- */
-public final class XRTSGenerator
-{
-
-  /**
-   * Parse the XML-based RTS source and create output according to an
-   * <code>RTSWriter</code> implementation.
-   *
-   * @param parser see class description.
-   * @param is the XML-based RTS source file.
-   * @param rtsw an <code>RTSWriter</code> implementation.
-   * @param parms a <code>Map</code> of command line parameters.
-   *
-   */
-  public static void generate(SAXParser parser, InputSource is, RTSWriter rtsw,
-    Map parms) throws Throwable
-  {
-    XRTSParser rtsp = new XRTSParser(rtsw, parms);
-    parser.parse(is, rtsp);
-  }
-
-  //
-  // No need to instantiate this class
-  //
-  private XRTSGenerator()
-  {
-  }
-}
diff --git a/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/XRTSParser.java b/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/XRTSParser.java
deleted file mode 100644
index bc90bf0..0000000
--- a/maven2-plugins/myfaces-xrts-plugin/src/main/java/org/apache/myfaces/buildtools/maven2/plugin/xrts/XRTSParser.java
+++ /dev/null
@@ -1,208 +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.
- */
-package org.apache.myfaces.buildtools.maven2.plugin.xrts;
-
-import java.util.Map;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.xml.sax.AttributeList;
-import org.xml.sax.HandlerBase;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-
-/**
- * */
-final class XRTSParser extends HandlerBase
-{
-
-  /**
-   * Empty constructor for the XRTSParser
-   *
-   */
-  public XRTSParser()
-  {
-  }
-
-  public XRTSParser(RTSWriter bw, Map parms)
-  {
-    _bundleWriter = bw;
-    _parms = parms;
-  }
-
-  /**
-   * Receive a Locator object for document events.
-   * Setting Locator ensures the SAX parser can find a given XML-based RTS
-   * document.  This method is closely related to the _fileToURL in
-   * <code>XRTSMakeBundle</code>.
-   *
-   * @param locator A locator for all SAX document events.
-   */
-  public void setDocumentLocator (Locator locator)
-  {
-    _locator = locator;
-  }
-
-  /**
-   * Receive notification of the beginning of the document.
-   * SAX Parser event for finding the beginning of an XML-based RTS document
-   */
-  public void startDocument() throws SAXException
-  {
-    _metaHt.put("fileType", "xrts");
-    _startDoc = true;
-
-  }
-
-  /**
-   * Receive notification of the end of the document.
-   * SAX Parser event for finding the end of an XML-based RTS document
-   */
-  public void endDocument() throws SAXException
-  {
-//    System.out.println("EndDocument");
-    try
-    {
-      _bundleWriter.endBundle(_parms, _metaHt);
-    }
-    catch (Throwable th)
-    {
-      throw new SAXException("endBundle Exception: " + th.getMessage());
-    }
-  }
-
-  /**
-   * Receive notification of the start of an element.
-   *
-   * @param name the element type name.
-   * @param attributes the specified or defaulted attributes.
-   */
-  public void startElement(String name, AttributeList atts) throws SAXException
-  {
-    _nestingLevel++;
-
-    // startBundle doesn't go in the startDocument method because it
-    // requires metadata to be passed and in particular, requires
-    // at least the package for any implementation of startBundle to work
-    if ((_nestingLevel == 2) && name.equals("resource"))
-    {
-      if (_startDoc)
-      {
-        try
-        {
-          _bundleWriter.startBundle(_parms, _metaHt);
-          _startDoc = false;
-        }
-        catch (Throwable th)
-        {
-          throw new SAXException("startBundle Exception: " + th.getMessage());
-        }
-      }
-
-      _currentResourceKey = atts.getValue("key");
-      if (_uniqKeys.contains(_currentResourceKey))
-      {
-        System.err.println("Duplicate id \"" + _currentResourceKey + "\"");
-      }
-
-      _uniqKeys.add(_currentResourceKey);
-      
-
-      _currentResourceValue = new StringBuilder();
-    }
-    else if ((_nestingLevel == 1) && name.equals("resources"))
-    {
-      _metaHt.put("package", atts.getValue("package"));
-      if (atts.getValue("version") != null)
-      {
-        _metaHt.put("version", atts.getValue("version"));
-      }
-      if (atts.getValue("baseversion") != null)
-      {
-        _metaHt.put("baseVersion", atts.getValue("baseversion"));
-      }
-    }
-  }
-
-  /**
-   * Receive notification of the end of an element.
-   * @param name the element type name.
-   */
-  public void endElement(String name) throws SAXException
-  {
-    if ((_nestingLevel == 2) && name.equals("resource"))
-    {
-      String value = _currentResourceValue.toString().trim();
-      try
-      {
-        _bundleWriter.writeString(_parms, _metaHt, _currentResourceKey, value);
-      }
-      catch (Throwable t)
-      {
-        throw new SAXException(t.getMessage());
-      }
-    }
-
-    _nestingLevel--;
-  }
-
-  /**
-   * Receive notification of ignorable whitespace in element content.
-   *
-   * @param ch the whitespace characters.
-   * @param start the start position in the character array.
-   * @param length the number of characters to use from the character array.
-   */
-  public void ignorableWhitespace(char[] cbuf, int start, int len)
-    throws SAXException
-  {
-//    System.out.println("IgnorableWhiteSpace" + len);
-  }
-
-  /**
-   * Receive notification of character data inside an element.
-   *
-   * @param ch the characters.
-   * @param start the start position in the character array.
-   * @param length the number of characters to use from the character array.
-   */
-  public void characters(char[] cbuf, int start, int len) throws SAXException
-  {
-    if (_nestingLevel == 2)
-    {
-      _currentResourceValue.append(cbuf, start, len);
-    }
-  }
-
-
-  // Store the locator
-  private Locator _locator;
-
-  private String _currentResourceKey;
-  private StringBuilder _currentResourceValue;
-  private Map<String, Object> _metaHt = new HashMap<String, Object>();
-  private Set<String> _uniqKeys = new HashSet<String>();
-
-  private RTSWriter _bundleWriter;
-  private Map _parms;
-
-  private int _nestingLevel = 0;
-  private boolean _startDoc = false;
-}
diff --git a/maven2-plugins/pom.xml b/maven2-plugins/pom.xml
deleted file mode 100644
index a3dc444..0000000
--- a/maven2-plugins/pom.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
--->
-
-<!--
-  - A "module" pom whose purpose is simply to build all maven modules
-  - in the subdirectories. This is NOT the parent pom of any project,
-  - and is not expected to ever be released.
-  -->
-
-<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>
-    <groupId>org.apache.myfaces</groupId>
-    <artifactId>myfaces</artifactId>
-    <version>6</version>
-  </parent>
-
-  <groupId>org.apache.myfaces.buildtools</groupId>
-  <artifactId>myfaces-plugin-module</artifactId>
-  <version>1-SNAPSHOT</version>
-  <packaging>pom</packaging>
-  <name>Apache MyFaces Buildtools Maven2 Plugin Module</name>
-  <url>http://myfaces.apache.org/build-tools/plugins</url>
-
-  <!-- WARNING: DO NOT DEPLOY SITE FROM HERE
-   A parent module is at myfaces-plugin-parent, so when 
-   a site needs to be deployed, run mvn site:site mvn site:deploy
-   from myfaces-plugin-parent and then for each one of the remaining
-   modules. If the goal is executed from here the site does not work
-   well. -->
-  <modules>
-    <module>myfaces-plugin-parent</module>
-    <module>myfaces-builder-annotations</module>
-    <module>myfaces-builder-plugin</module>
-    <module>myfaces-faces-plugin</module>
-    <module>myfaces-i18n-plugin</module>
-    <module>myfaces-javacc-plugin</module>
-    <module>myfaces-javascript-plugin</module>
-    <module>myfaces-jdev-plugin</module>
-    <module>myfaces-tagdoc-plugin</module>
-    <module>myfaces-wagon-plugin</module>
-    <module>myfaces-xrts-plugin</module>
-  </modules>
-
-</project>
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-facelets/LICENSE.txt b/myfaces-archetype-helloworld-facelets/LICENSE.txt
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-facelets/LICENSE.txt
rename to myfaces-archetype-helloworld-facelets/LICENSE.txt
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-facelets/NOTICE.txt b/myfaces-archetype-helloworld-facelets/NOTICE.txt
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-facelets/NOTICE.txt
rename to myfaces-archetype-helloworld-facelets/NOTICE.txt
diff --git a/myfaces-archetype-helloworld-facelets/pom.xml b/myfaces-archetype-helloworld-facelets/pom.xml
new file mode 100644
index 0000000..de5601c
--- /dev/null
+++ b/myfaces-archetype-helloworld-facelets/pom.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT 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.myfaces.buildtools</groupId>
+    <artifactId>myfaces-archetype-parent</artifactId>
+    <version>1.0.2</version>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.myfaces.buildtools</groupId>
+  <artifactId>myfaces-archetype-helloworld-facelets</artifactId>
+  <packaging>maven-plugin</packaging>
+  <name>MyFaces Facelets Archetype</name>
+  <description>Archetype to create a new webapp based on MyFaces and Facelets</description>
+
+</project>
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/META-INF/maven/archetype.xml b/myfaces-archetype-helloworld-facelets/src/main/resources/META-INF/maven/archetype.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/META-INF/maven/archetype.xml
rename to myfaces-archetype-helloworld-facelets/src/main/resources/META-INF/maven/archetype.xml
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/pom.xml b/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/pom.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/pom.xml
rename to myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/pom.xml
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/java/HelloWorldBacking.java b/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/java/HelloWorldBacking.java
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/java/HelloWorldBacking.java
rename to myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/java/HelloWorldBacking.java
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/log4j/log4j.properties b/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/log4j/log4j.properties
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/log4j/log4j.properties
rename to myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/log4j/log4j.properties
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/examples-config.xml b/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/examples-config.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/examples-config.xml
rename to myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/examples-config.xml
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml b/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml
rename to myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/helloWorld.xhtml b/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/helloWorld.xhtml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/helloWorld.xhtml
rename to myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/helloWorld.xhtml
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/index.jsp b/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/index.jsp
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/index.jsp
rename to myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/index.jsp
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/page2.xhtml b/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/page2.xhtml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/page2.xhtml
rename to myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/page2.xhtml
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/template.xhtml b/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/template.xhtml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/template.xhtml
rename to myfaces-archetype-helloworld-facelets/src/main/resources/archetype-resources/src/main/webapp/template.xhtml
diff --git a/myfaces-archetype-helloworld-portlets/pom.xml b/myfaces-archetype-helloworld-portlets/pom.xml
new file mode 100644
index 0000000..2180d0e
--- /dev/null
+++ b/myfaces-archetype-helloworld-portlets/pom.xml
@@ -0,0 +1,16 @@
+<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.myfaces.buildtools</groupId>
+        <artifactId>myfaces-archetype-parent</artifactId>
+        <version>1.0.2</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.apache.myfaces.buildtools</groupId>
+    <artifactId>myfaces-archetype-helloworld-portlets</artifactId>
+    <packaging>maven-plugin</packaging>
+    <name>MyFaces Portlet Archetype</name>
+    <description>Archetype to create a new portlet webapp based on myfaces</description>
+
+</project>
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/META-INF/archetype.xml b/myfaces-archetype-helloworld-portlets/src/main/resources/META-INF/archetype.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/META-INF/archetype.xml
rename to myfaces-archetype-helloworld-portlets/src/main/resources/META-INF/archetype.xml
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/pom.xml b/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/pom.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/pom.xml
rename to myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/pom.xml
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/java/NameBean.java b/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/java/NameBean.java
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/java/NameBean.java
rename to myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/java/NameBean.java
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/log4j/log4j.properties b/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/log4j/log4j.properties
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/log4j/log4j.properties
rename to myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/log4j/log4j.properties
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/faces-config.xml b/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/faces-config.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/faces-config.xml
rename to myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/faces-config.xml
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/jetty-pluto-web-default.xml b/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/jetty-pluto-web-default.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/jetty-pluto-web-default.xml
rename to myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/jetty-pluto-web-default.xml
Binary files differ
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/portlet.xml b/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/portlet.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/portlet.xml
rename to myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/portlet.xml
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml b/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml
rename to myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/edit.jsp b/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/edit.jsp
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/edit.jsp
rename to myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/edit.jsp
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/helloworld/hello.jsp b/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/helloworld/hello.jsp
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/helloworld/hello.jsp
rename to myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/helloworld/hello.jsp
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/helloworld/index.jsp b/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/helloworld/index.jsp
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/helloworld/index.jsp
rename to myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/helloworld/index.jsp
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/help.jsp b/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/help.jsp
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/help.jsp
rename to myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/help.jsp
diff --git a/maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/index.jsp b/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/index.jsp
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/index.jsp
rename to myfaces-archetype-helloworld-portlets/src/main/resources/archetype-resources/src/main/webapp/index.jsp
diff --git a/maven2-archetypes/myfaces-archetype-helloworld/LICENSE.txt b/myfaces-archetype-helloworld/LICENSE.txt
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld/LICENSE.txt
rename to myfaces-archetype-helloworld/LICENSE.txt
diff --git a/maven2-archetypes/myfaces-archetype-helloworld/NOTICE.txt b/myfaces-archetype-helloworld/NOTICE.txt
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld/NOTICE.txt
rename to myfaces-archetype-helloworld/NOTICE.txt
diff --git a/myfaces-archetype-helloworld/pom.xml b/myfaces-archetype-helloworld/pom.xml
new file mode 100644
index 0000000..306eac2
--- /dev/null
+++ b/myfaces-archetype-helloworld/pom.xml
@@ -0,0 +1,16 @@
+<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.myfaces.buildtools</groupId>
+        <artifactId>myfaces-archetype-parent</artifactId>
+        <version>1.0.2</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.apache.myfaces.buildtools</groupId>
+    <artifactId>myfaces-archetype-helloworld</artifactId>
+    <packaging>maven-plugin</packaging>
+    <name>MyFaces Basic Archetype</name>
+    <description>Archetype to create a new webapp based on myfaces</description>
+
+</project>
diff --git a/maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/META-INF/archetype.xml b/myfaces-archetype-helloworld/src/main/resources/META-INF/archetype.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/META-INF/archetype.xml
rename to myfaces-archetype-helloworld/src/main/resources/META-INF/archetype.xml
diff --git a/maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/archetype-resources/pom.xml b/myfaces-archetype-helloworld/src/main/resources/archetype-resources/pom.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/archetype-resources/pom.xml
rename to myfaces-archetype-helloworld/src/main/resources/archetype-resources/pom.xml
diff --git a/maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/java/HelloWorldController.java b/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/java/HelloWorldController.java
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/java/HelloWorldController.java
rename to myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/java/HelloWorldController.java
diff --git a/maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/log4j/log4j.properties b/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/log4j/log4j.properties
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/log4j/log4j.properties
rename to myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/log4j/log4j.properties
diff --git a/maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/faces-config.xml b/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/faces-config.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/faces-config.xml
rename to myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/faces-config.xml
diff --git a/maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml b/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml
rename to myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml
diff --git a/maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/helloWorld.jsp b/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/helloWorld.jsp
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/helloWorld.jsp
rename to myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/helloWorld.jsp
diff --git a/maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/index.jsp b/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/index.jsp
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/index.jsp
rename to myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/index.jsp
diff --git a/maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/page2.jsp b/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/page2.jsp
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/page2.jsp
rename to myfaces-archetype-helloworld/src/main/resources/archetype-resources/src/main/webapp/page2.jsp
diff --git a/maven2-archetypes/myfaces-archetype-helloworld/src/site/apt/index.apt b/myfaces-archetype-helloworld/src/site/apt/index.apt
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld/src/site/apt/index.apt
rename to myfaces-archetype-helloworld/src/site/apt/index.apt
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/LICENSE.txt b/myfaces-archetype-jsfcomponents/LICENSE.txt
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/LICENSE.txt
rename to myfaces-archetype-jsfcomponents/LICENSE.txt
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/NOTICE.txt b/myfaces-archetype-jsfcomponents/NOTICE.txt
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/NOTICE.txt
rename to myfaces-archetype-jsfcomponents/NOTICE.txt
diff --git a/myfaces-archetype-jsfcomponents/pom.xml b/myfaces-archetype-jsfcomponents/pom.xml
new file mode 100644
index 0000000..f29685e
--- /dev/null
+++ b/myfaces-archetype-jsfcomponents/pom.xml
@@ -0,0 +1,15 @@
+<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.myfaces.buildtools</groupId>
+    <artifactId>myfaces-archetype-parent</artifactId>
+    <version>1.0.2</version>
+  </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.apache.myfaces.buildtools</groupId>
+    <artifactId>myfaces-archetype-jsfcomponents</artifactId>
+    <packaging>maven-plugin</packaging>
+    <name>JSF Component Library Archetype</name>
+    <description>Archetype to create a libary project of JSF components</description>
+</project>
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/META-INF/archetype.xml b/myfaces-archetype-jsfcomponents/src/main/resources/META-INF/archetype.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/META-INF/archetype.xml
rename to myfaces-archetype-jsfcomponents/src/main/resources/META-INF/archetype.xml
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/pom.xml b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/pom.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/pom.xml
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/pom.xml
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/component/sayhello/AbstractSayHello.java b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/component/sayhello/AbstractSayHello.java
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/component/sayhello/AbstractSayHello.java
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/component/sayhello/AbstractSayHello.java
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/component/sayhello/SayHelloRenderer.java b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/component/sayhello/SayHelloRenderer.java
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/component/sayhello/SayHelloRenderer.java
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/component/sayhello/SayHelloRenderer.java
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/converter/PhoneNumber.java b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/converter/PhoneNumber.java
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/converter/PhoneNumber.java
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/converter/PhoneNumber.java
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/converter/PhoneNumberConverter.java b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/converter/PhoneNumberConverter.java
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/converter/PhoneNumberConverter.java
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/converter/PhoneNumberConverter.java
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/validator/AbstractOddNumberValidator.java b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/validator/AbstractOddNumberValidator.java
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/validator/AbstractOddNumberValidator.java
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/java/org/myorganization/validator/AbstractOddNumberValidator.java
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/componentClass12.vm b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/componentClass12.vm
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/componentClass12.vm
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/componentClass12.vm
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/faces-config.xml b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/faces-config.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/faces-config.xml
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/faces-config.xml
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/mycomponents.taglib.xml b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/mycomponents.taglib.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/mycomponents.taglib.xml
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/mycomponents.taglib.xml
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/mycomponents.tld.vm b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/mycomponents.tld.vm
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/mycomponents.tld.vm
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/mycomponents.tld.vm
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/tagClass12.vm b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/tagClass12.vm
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/tagClass12.vm
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/tagClass12.vm
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/tagConverterClass12.vm b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/tagConverterClass12.vm
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/tagConverterClass12.vm
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/tagConverterClass12.vm
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/tagValidatorClass12.vm b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/tagValidatorClass12.vm
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/tagValidatorClass12.vm
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/tagValidatorClass12.vm
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/validatorClass12.vm b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/validatorClass12.vm
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/validatorClass12.vm
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/main/resources/META-INF/validatorClass12.vm
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/test/java/org/myorganization/component/sayhello/SayHelloRendererTest.java b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/test/java/org/myorganization/component/sayhello/SayHelloRendererTest.java
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/test/java/org/myorganization/component/sayhello/SayHelloRendererTest.java
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/test/java/org/myorganization/component/sayhello/SayHelloRendererTest.java
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/test/java/org/myorganization/converter/PhoneNumberConverterTest.java b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/test/java/org/myorganization/converter/PhoneNumberConverterTest.java
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/test/java/org/myorganization/converter/PhoneNumberConverterTest.java
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/test/java/org/myorganization/converter/PhoneNumberConverterTest.java
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/test/java/org/myorganization/validator/OddNumberValidatorTest.java b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/test/java/org/myorganization/validator/OddNumberValidatorTest.java
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/test/java/org/myorganization/validator/OddNumberValidatorTest.java
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/core/src/test/java/org/myorganization/validator/OddNumberValidatorTest.java
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/pom.xml b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/pom.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/pom.xml
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/pom.xml
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/java/org/myorganization/component/example/SayHelloBean.java b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/java/org/myorganization/component/example/SayHelloBean.java
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/java/org/myorganization/component/example/SayHelloBean.java
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/java/org/myorganization/component/example/SayHelloBean.java
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/log4j/log4j.properties b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/log4j/log4j.properties
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/log4j/log4j.properties
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/log4j/log4j.properties
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/resources/org/myorganization/component/example/build.properties b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/resources/org/myorganization/component/example/build.properties
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/resources/org/myorganization/component/example/build.properties
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/resources/org/myorganization/component/example/build.properties
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/WEB-INF/examples-config.xml b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/WEB-INF/examples-config.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/WEB-INF/examples-config.xml
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/WEB-INF/examples-config.xml
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/WEB-INF/web.xml b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/WEB-INF/web.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/WEB-INF/web.xml
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/WEB-INF/web.xml
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/converterDemo.jsp b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/converterDemo.jsp
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/converterDemo.jsp
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/converterDemo.jsp
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/converterDemoResult.jsp b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/converterDemoResult.jsp
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/converterDemoResult.jsp
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/converterDemoResult.jsp
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/home.jsp b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/home.jsp
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/home.jsp
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/home.jsp
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/index.jsp b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/index.jsp
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/index.jsp
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/index.jsp
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/sayhello.jsp b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/sayhello.jsp
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/sayhello.jsp
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/sayhello.jsp
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/validatorDemo.jsp b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/validatorDemo.jsp
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/validatorDemo.jsp
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/validatorDemo.jsp
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/validatorDemoResult.jsp b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/validatorDemoResult.jsp
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/validatorDemoResult.jsp
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/examples/src/main/webapp/validatorDemoResult.jsp
diff --git a/maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/pom.xml b/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/pom.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/pom.xml
rename to myfaces-archetype-jsfcomponents/src/main/resources/archetype-resources/pom.xml
diff --git a/maven2-archetypes/myfaces-archetype-trinidad/LICENSE.txt b/myfaces-archetype-trinidad/LICENSE.txt
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-trinidad/LICENSE.txt
rename to myfaces-archetype-trinidad/LICENSE.txt
diff --git a/maven2-archetypes/myfaces-archetype-trinidad/NOTICE.txt b/myfaces-archetype-trinidad/NOTICE.txt
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-trinidad/NOTICE.txt
rename to myfaces-archetype-trinidad/NOTICE.txt
diff --git a/myfaces-archetype-trinidad/pom.xml b/myfaces-archetype-trinidad/pom.xml
new file mode 100644
index 0000000..74347e9
--- /dev/null
+++ b/myfaces-archetype-trinidad/pom.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT 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.myfaces.buildtools</groupId>
+    <artifactId>myfaces-archetype-parent</artifactId>
+    <version>1.0.2</version>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.myfaces.buildtools</groupId>
+  <artifactId>myfaces-archetype-trinidad</artifactId>
+  <packaging>maven-plugin</packaging>
+  <name>MyFaces Trinidad Archetype</name>
+  <description>Archetype to create a new webapp based on Trinidad</description>
+</project>
diff --git a/maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/META-INF/LICENSE b/myfaces-archetype-trinidad/src/main/resources/META-INF/LICENSE
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/META-INF/LICENSE
rename to myfaces-archetype-trinidad/src/main/resources/META-INF/LICENSE
diff --git a/maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/META-INF/NOTICE b/myfaces-archetype-trinidad/src/main/resources/META-INF/NOTICE
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/META-INF/NOTICE
rename to myfaces-archetype-trinidad/src/main/resources/META-INF/NOTICE
diff --git a/maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/META-INF/archetype.xml b/myfaces-archetype-trinidad/src/main/resources/META-INF/archetype.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/META-INF/archetype.xml
rename to myfaces-archetype-trinidad/src/main/resources/META-INF/archetype.xml
diff --git a/maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/archetype-resources/pom.xml b/myfaces-archetype-trinidad/src/main/resources/archetype-resources/pom.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/archetype-resources/pom.xml
rename to myfaces-archetype-trinidad/src/main/resources/archetype-resources/pom.xml
diff --git a/maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/java/HelloWorldBacking.java b/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/java/HelloWorldBacking.java
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/java/HelloWorldBacking.java
rename to myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/java/HelloWorldBacking.java
diff --git a/maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/log4j/log4j.properties b/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/log4j/log4j.properties
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/log4j/log4j.properties
rename to myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/log4j/log4j.properties
diff --git a/maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/faces-config.xml b/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/faces-config.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/faces-config.xml
rename to myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/faces-config.xml
diff --git a/maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml b/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml
rename to myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/web.xml
diff --git a/maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/webapp/index.jspx b/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/webapp/index.jspx
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/webapp/index.jspx
rename to myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/webapp/index.jspx
diff --git a/maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/webapp/page2.jspx b/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/webapp/page2.jspx
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/webapp/page2.jspx
rename to myfaces-archetype-trinidad/src/main/resources/archetype-resources/src/main/webapp/page2.jspx
diff --git a/other/checkstyle-rules/LICENSE.txt b/other/checkstyle-rules/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/other/checkstyle-rules/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/other/checkstyle-rules/NOTICE.txt b/other/checkstyle-rules/NOTICE.txt
deleted file mode 100644
index 32b4a1f..0000000
--- a/other/checkstyle-rules/NOTICE.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-=========================================================================
-==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
-==  Version 2.0, in this case for the Apache MyFaces Maven Plugins     ==
-=========================================================================
-
-This product includes software developed by 
-The Apache Software Foundation (http://www.apache.org/).
diff --git a/other/checkstyle-rules/pom.xml b/other/checkstyle-rules/pom.xml
deleted file mode 100644
index fe138f3..0000000
--- a/other/checkstyle-rules/pom.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<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>
-    <!--
-      - Note that this parent declaration is a little weird; the checkstyle plugin configuration in
-      - the parent pom references this artifact. Possibly the parent pom should be refactored into
-      - two parts; the bits we want to inherit here (distributionManagement, mailingLists etc) and
-      - a separate pom that references this artifact. However this works for now.
-      -->
-    <groupId>org.apache.myfaces</groupId>
-    <artifactId>myfaces</artifactId>
-    <version>6</version>
-  </parent>
-
-  <groupId>org.apache.myfaces.buildtools</groupId>
-  <artifactId>checkstyle-rules</artifactId>
-  <packaging>jar</packaging>
-  <version>2-SNAPSHOT</version>
-  <name>checkstyle-rules</name>
-  <url>http://maven.apache.org</url>
-
-  <build>
-    <resources>
-      <resource>
-        <directory>${basedir}</directory>
-        <targetPath>META-INF</targetPath>
-        <includes>
-          <include>NOTICE.txt</include>
-          <include>LICENSE.txt</include>
-        </includes>
-      </resource>
-      <resource>
-        <directory>${basedir}/src/main/resources</directory>
-      </resource>
-    </resources>
-  </build>
-
-</project>
diff --git a/other/checkstyle-rules/src/main/resources/default/myfaces-checks-minimal.xml b/other/checkstyle-rules/src/main/resources/default/myfaces-checks-minimal.xml
deleted file mode 100644
index e74105d..0000000
--- a/other/checkstyle-rules/src/main/resources/default/myfaces-checks-minimal.xml
+++ /dev/null
@@ -1,53 +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.
- */ -->
-
-<!DOCTYPE module PUBLIC
-    "-//Puppy Crawl//DTD Check Configuration 1.1//EN"
-    "http://www.puppycrawl.com/dtds/configuration_1_1.dtd">
-
-<!--
-  Checkstyle configuration that checks the maven coding conventions.
-  This checks the absolute minimum, and should only be used for
-  projects that have really ugly existing code and are not worth
-  fixing up.
-  -->
-
-<module name="Checker">
-
-    <module name="TreeWalker">
-
-        <property name="cacheFile" value="${checkstyle.cache.file}"/>
-
-        <module name="TypeName">
-          <property name="format" value="^_?[A-Z][a-zA-Z0-9]*$"/>
-        </module>
-
-        <module name="Header">
-            <property name="headerFile" value="${checkstyle.header.file}"/>
-        </module>
-
-        <module name="TabCharacter"/>
-
-        <module name="UpperEll"/>
-
-    </module>
-
-</module>
diff --git a/other/checkstyle-rules/src/main/resources/default/myfaces-checks-standard.xml b/other/checkstyle-rules/src/main/resources/default/myfaces-checks-standard.xml
deleted file mode 100644
index 458bd6b..0000000
--- a/other/checkstyle-rules/src/main/resources/default/myfaces-checks-standard.xml
+++ /dev/null
@@ -1,174 +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.
- */ -->
-
-<!DOCTYPE module PUBLIC
-    "-//Puppy Crawl//DTD Check Configuration 1.1//EN"
-    "http://www.puppycrawl.com/dtds/configuration_1_1.dtd">
-
-<!--
-  Checkstyle configuration that checks the maven coding conventions.
--->
-
-<module name="Checker">
-
-    <!-- Checks that a package.html file exists for each package.     -->
-    <!-- See http://checkstyle.sf.net/config_javadoc.html#PackageHtml -->
-    <!-- module name="PackageHtml"/ -->
-
-    <!-- Checks whether files end with a new line.                        -->
-    <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
-    <!-- module name="NewlineAtEndOfFile"/ -->
-
-    <!-- Checks that property files contain the same keys.         -->
-    <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
-    <!-- module name="Translation"/ -->
-
-    <module name="TreeWalker">
-
-        <property name="cacheFile" value="${checkstyle.cache.file}"/>
-
-        <!-- Checks for Javadoc comments.                     -->
-        <!-- See http://checkstyle.sf.net/config_javadoc.html -->
-        <!-- module name="JavadocMethod"/ -->
-        <!-- module name="JavadocType"/ -->
-        <!-- module name="JavadocVariable"/ -->
-
-
-        <!-- Checks for Naming Conventions.                  -->
-        <!-- See http://checkstyle.sf.net/config_naming.html -->
-<!--
-        <module name="MemberName">
-          <property name="format" value="^_[a-z][a-zA-Z0-9]*$"/>
-        </module>
--->
-
-        <module name="ConstantName">
-          <!-- Normal rules, except that:
-             -  * any name can start with an underscore.
-             -  * "log" is allowed; this is a traditional name for log objects
-             -  * names ending with "ThreadLocal" are allowed so that threadlocal vars don't have to be
-             -    all-caps. They are static final, but are not really constants. Yes, type prefixes
-             -    on variable names sucks ("hungarian notation") but checkstyle doesn't allow 
-             -    name rules to vary by the type of the constant, and no other alternative seems
-             -    any better.
-             -->
-          <property name="format" 
-             value="^_?((log)|([a-z][a-zA-Z]*ThreadLocal)|([A-Z][A-Z0-9]*(_[A-Z0-9]+)*))$"/>
-        </module>
-
-        <module name="LocalVariableName"/>
-        <module name="MethodName">
-          <property name="format" value="^_?[a-z][a-zA-Z0-9]*$"/>
-        </module>
-        <module name="PackageName"/>
-        <module name="LocalFinalVariableName"/>
-        <module name="ParameterName"/>
-        <module name="StaticVariableName"/>
-        <module name="TypeName">
-          <property name="format" value="^_?[A-Z][a-zA-Z0-9]*$"/>
-        </module>
-
-
-        <!-- Checks for Headers                              -->
-        <!-- See http://checkstyle.sf.net/config_header.html -->
-        <module name="Header">
-            <property name="headerFile" value="${checkstyle.header.file}"/>
-        </module>
-
-
-        <!-- Checks for imports                              -->
-        <!-- See http://checkstyle.sf.net/config_import.html -->
-        <module name="AvoidStarImport"/>
-        <module name="IllegalImport"/>
-        <module name="RedundantImport"/>
-        <module name="UnusedImports"/>
-
-
-        <!-- Checks for Size Violations.                    -->
-        <!-- See http://checkstyle.sf.net/config_sizes.html -->
-        <module name="FileLength"/>
-        <module name="LineLength">
-          <property name="max" value="120" />
-          <property name="ignorePattern" value="@version|@see"/>
-        </module>
-        <module name="MethodLength">
-          <property name="max" value="200" />
-        </module>
-        <module name="ParameterNumber">
-          <property name="max" value="10" />
-        </module>
-
-
-        <!-- Checks for whitespace                               -->
-        <!-- See http://checkstyle.sf.net/config_whitespace.html -->
-        <module name="TabCharacter"/>
-
-        <!-- Modifier Checks                                    -->
-        <!-- See http://checkstyle.sf.net/config_modifiers.html -->
-        <!-- module name="ModifierOrder"/ -->
-        <!-- module name="RedundantModifier"/ -->
-
-        <!-- Checks for blocks. You know, those {}'s         -->
-        <!-- See http://checkstyle.sf.net/config_blocks.html -->
-        <!-- module name="EmptyBlock"/ -->
-        <module name="NeedBraces"/>
-        <module name="LeftCurly">
-          <property name="option" value="nl"/>
-        </module>
-        <module name="RightCurly">
-          <property name="option" value="alone"/>
-        </module>
-
-        <!-- Checks for common coding problems               -->
-        <!-- See http://checkstyle.sf.net/config_coding.html -->
-        <module name="DoubleCheckedLocking"/>
-        <module name="EmptyStatement"/>
-        <module name="EqualsHashCode"/>
-        <module name="InnerAssignment"/>
-        <module name="DefaultComesLast"/>
-        <module name="MissingSwitchDefault"/>
-        <module name="FallThrough"/>
-        <module name="MultipleVariableDeclarations"/>
-
-        <!-- Checks for class design                         -->
-        <!-- See http://checkstyle.sf.net/config_design.html -->
-        <!-- module name="DesignForExtension"/ -->
-        <!-- module name="FinalClass"/ -->
-        <!-- module name="HideUtilityClassConstructor"/ -->
-        <!-- module name="InterfaceIsType"/ -->
-        <!-- module name="VisibilityModifier"/ -->
-
-
-        <!-- Miscellaneous other checks.                   -->
-        <!-- See http://checkstyle.sf.net/config_misc.html -->
-        <!-- module name="ArrayTypeStyle"/ -->
-        <!-- module name="FinalParameters"/ -->
-        <!-- Line with Trailing Spaces (disabled as it's to noisy)
-        <module name="GenericIllegalRegexp">
-            <property name="format" value="\s+$"/>
-            <property name="message" value="Line has trailing spaces."/>
-        </module>
-          -->
-        <module name="UpperEll"/>
-
-    </module>
-
-</module>
diff --git a/other/checkstyle-rules/src/main/resources/default/myfaces-checks-strict.xml b/other/checkstyle-rules/src/main/resources/default/myfaces-checks-strict.xml
deleted file mode 100644
index 0de6a5e..0000000
--- a/other/checkstyle-rules/src/main/resources/default/myfaces-checks-strict.xml
+++ /dev/null
@@ -1,174 +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.
- */ -->
-
-<!DOCTYPE module PUBLIC
-    "-//Puppy Crawl//DTD Check Configuration 1.1//EN"
-    "http://www.puppycrawl.com/dtds/configuration_1_1.dtd">
-
-<!--
-  Checkstyle configuration that checks the maven coding conventions.
-  This enforces stricter quality checks than the "myfaces-checks.xml"
-  file does. Ideally this would be used everywhere, but...
--->
-
-<module name="Checker">
-
-    <!-- Checks that a package.html file exists for each package.     -->
-    <!-- See http://checkstyle.sf.net/config_javadoc.html#PackageHtml -->
-    <!-- module name="PackageHtml"/ -->
-
-    <!-- Checks whether files end with a new line.                        -->
-    <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
-    <!-- module name="NewlineAtEndOfFile"/ -->
-
-    <!-- Checks that property files contain the same keys.         -->
-    <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
-    <!-- module name="Translation"/ -->
-
-    <module name="TreeWalker">
-
-        <property name="cacheFile" value="${checkstyle.cache.file}"/>
-
-        <!-- Checks for Javadoc comments.                     -->
-        <!-- See http://checkstyle.sf.net/config_javadoc.html -->
-        <!-- module name="JavadocMethod"/ -->
-        <!-- module name="JavadocType"/ -->
-        <!-- module name="JavadocVariable"/ -->
-
-
-        <!-- Checks for Naming Conventions.                  -->
-        <!-- See http://checkstyle.sf.net/config_naming.html -->
-        <module name="MemberName">
-          <property name="format" value="^_[a-z][a-zA-Z0-9]*$"/>
-        </module>
-
-        <module name="ConstantName">
-          <!-- Normal rules, except that:
-             -  * any name can start with an underscore.
-             -  * "log" is allowed; this is a traditional name for log objects
-             -  * names ending with "ThreadLocal" are allowed so that threadlocal vars don't have to be
-             -    all-caps. They are static final, but are not really constants. Yes, type prefixes
-             -    on variable names sucks ("hungarian notation") but checkstyle doesn't allow 
-             -    name rules to vary by the type of the constant, and no other alternative seems
-             -    any better.
-             -->
-          <property name="format" 
-             value="^_?((log)|([a-z][a-zA-Z]*ThreadLocal)|([A-Z][A-Z0-9]*(_[A-Z0-9]+)*))$"/>
-        </module>
-
-        <module name="LocalVariableName"/>
-        <module name="MethodName">
-          <property name="format" value="^_?[a-z][a-zA-Z0-9]*$"/>
-        </module>
-        <module name="PackageName"/>
-        <module name="LocalFinalVariableName"/>
-        <module name="ParameterName"/>
-        <module name="StaticVariableName"/>
-        <module name="TypeName">
-          <property name="format" value="^_?[A-Z][a-zA-Z0-9]*$"/>
-        </module>
-
-
-        <!-- Checks for Headers                              -->
-        <!-- See http://checkstyle.sf.net/config_header.html -->
-        <module name="Header">
-            <property name="headerFile" value="${checkstyle.header.file}"/>
-        </module>
-
-
-        <!-- Checks for imports                              -->
-        <!-- See http://checkstyle.sf.net/config_import.html -->
-        <module name="AvoidStarImport"/>
-        <module name="IllegalImport"/>
-        <module name="RedundantImport"/>
-        <module name="UnusedImports"/>
-
-
-        <!-- Checks for Size Violations.                    -->
-        <!-- See http://checkstyle.sf.net/config_sizes.html -->
-        <module name="FileLength"/>
-        <module name="LineLength">
-          <property name="max" value="120" />
-          <property name="ignorePattern" value="@version|@see"/>
-        </module>
-        <module name="MethodLength">
-          <property name="max" value="200" />
-        </module>
-        <module name="ParameterNumber">
-          <property name="max" value="10" />
-        </module>
-
-
-        <!-- Checks for whitespace                               -->
-        <!-- See http://checkstyle.sf.net/config_whitespace.html -->
-        <module name="TabCharacter"/>
-
-        <!-- Modifier Checks                                    -->
-        <!-- See http://checkstyle.sf.net/config_modifiers.html -->
-        <!-- module name="ModifierOrder"/ -->
-        <!-- module name="RedundantModifier"/ -->
-
-        <!-- Checks for blocks. You know, those {}'s         -->
-        <!-- See http://checkstyle.sf.net/config_blocks.html -->
-        <!-- module name="EmptyBlock"/ -->
-        <module name="NeedBraces"/>
-        <module name="LeftCurly">
-          <property name="option" value="nl"/>
-        </module>
-        <module name="RightCurly">
-          <property name="option" value="alone"/>
-        </module>
-
-        <!-- Checks for common coding problems               -->
-        <!-- See http://checkstyle.sf.net/config_coding.html -->
-        <module name="DoubleCheckedLocking"/>
-        <module name="EmptyStatement"/>
-        <module name="EqualsHashCode"/>
-        <module name="InnerAssignment"/>
-        <module name="DefaultComesLast"/>
-        <module name="MissingSwitchDefault"/>
-        <module name="FallThrough"/>
-        <module name="MultipleVariableDeclarations"/>
-
-        <!-- Checks for class design                         -->
-        <!-- See http://checkstyle.sf.net/config_design.html -->
-        <!-- module name="DesignForExtension"/ -->
-        <!-- module name="FinalClass"/ -->
-        <!-- module name="HideUtilityClassConstructor"/ -->
-        <!-- module name="InterfaceIsType"/ -->
-        <!-- module name="VisibilityModifier"/ -->
-
-
-        <!-- Miscellaneous other checks.                   -->
-        <!-- See http://checkstyle.sf.net/config_misc.html -->
-        <!-- module name="ArrayTypeStyle"/ -->
-        <!-- module name="FinalParameters"/ -->
-        <!-- Line with Trailing Spaces (disabled as it's to noisy)
-        <module name="GenericIllegalRegexp">
-            <property name="format" value="\s+$"/>
-            <property name="message" value="Line has trailing spaces."/>
-        </module>
-          -->
-        <module name="UpperEll"/>
-
-    </module>
-
-</module>
diff --git a/other/checkstyle-rules/src/main/resources/default/myfaces-codestyle-eclipse.txt b/other/checkstyle-rules/src/main/resources/default/myfaces-codestyle-eclipse.txt
deleted file mode 100644
index 8c1a248..0000000
--- a/other/checkstyle-rules/src/main/resources/default/myfaces-codestyle-eclipse.txt
+++ /dev/null
@@ -1,264 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<profiles version="11">
-<profile kind="CodeFormatterProfile" name="myfaces" version="11">
-<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
-<setting id="org.eclipse.jdt.core.compiler.source" value="1.5"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
-<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
-<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
-<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
-<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.5"/>
-<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="120"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
-<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.5"/>
-<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="next_line"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
-</profile>
-</profiles>
diff --git a/other/checkstyle-rules/src/main/resources/default/myfaces-codestyle-idea.xml b/other/checkstyle-rules/src/main/resources/default/myfaces-codestyle-idea.xml
deleted file mode 100644
index 829aeb2..0000000
--- a/other/checkstyle-rules/src/main/resources/default/myfaces-codestyle-idea.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<code_scheme name="myfaces-idea-codestyle.txt">
-  <option name="BRACE_STYLE" value="2" />
-  <option name="CLASS_BRACE_STYLE" value="2" />
-  <option name="METHOD_BRACE_STYLE" value="2" />
-  <option name="ELSE_ON_NEW_LINE" value="true" />
-  <option name="WHILE_ON_NEW_LINE" value="true" />
-  <option name="CATCH_ON_NEW_LINE" value="true" />
-  <option name="FINALLY_ON_NEW_LINE" value="true" />
-  <option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" />
-  <option name="ALIGN_MULTILINE_FOR" value="false" />
-  <option name="IF_BRACE_FORCE" value="3" />
-  <option name="DOWHILE_BRACE_FORCE" value="3" />
-  <option name="WHILE_BRACE_FORCE" value="3" />
-  <option name="FOR_BRACE_FORCE" value="3" />
-  <option name="ENABLE_JAVADOC_FORMATTING" value="false" />
-  <option name="JD_P_AT_EMPTY_LINES" value="false" />
-  <ADDITIONAL_INDENT_OPTIONS fileType="js">
-    <option name="INDENT_SIZE" value="4" />
-    <option name="CONTINUATION_INDENT_SIZE" value="8" />
-    <option name="TAB_SIZE" value="4" />
-    <option name="USE_TAB_CHARACTER" value="false" />
-    <option name="SMART_TABS" value="false" />
-    <option name="LABEL_INDENT_SIZE" value="0" />
-    <option name="LABEL_INDENT_ABSOLUTE" value="false" />
-  </ADDITIONAL_INDENT_OPTIONS>
-</code_scheme>
-
diff --git a/other/checkstyle-rules/src/main/resources/default/myfaces-header-regexp.txt b/other/checkstyle-rules/src/main/resources/default/myfaces-header-regexp.txt
deleted file mode 100644
index 898e51c..0000000
--- a/other/checkstyle-rules/src/main/resources/default/myfaces-header-regexp.txt
+++ /dev/null
@@ -1,18 +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.$
-^ \*/$
diff --git a/other/checkstyle-rules/src/main/resources/default/myfaces-header-spaces.txt b/other/checkstyle-rules/src/main/resources/default/myfaces-header-spaces.txt
deleted file mode 100644
index 224f1d6..0000000
--- a/other/checkstyle-rules/src/main/resources/default/myfaces-header-spaces.txt
+++ /dev/null
@@ -1,18 +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.
- */
diff --git a/other/checkstyle-rules/src/main/resources/default/myfaces-header.txt b/other/checkstyle-rules/src/main/resources/default/myfaces-header.txt
deleted file mode 100644
index 042f3ce..0000000
--- a/other/checkstyle-rules/src/main/resources/default/myfaces-header.txt
+++ /dev/null
@@ -1,18 +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.
- */
diff --git a/other/checkstyle-rules/src/main/resources/tobago/checkstyle-header.txt b/other/checkstyle-rules/src/main/resources/tobago/checkstyle-header.txt
deleted file mode 100644
index d0a2103..0000000
--- a/other/checkstyle-rules/src/main/resources/tobago/checkstyle-header.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-^package
-^$
-^/\*$
-^ \* Licensed to the Apache Software Foundation \(ASF\) under one or more$
-^ \* contributor license agreements.  See the NOTICE file distributed with$
-^ \* this work for additional information regarding copyright ownership.$
-^ \* The ASF licenses this file to You under the Apache License, Version 2.0$
-^ \* \(the "License"\); you may not use this file except in compliance with$
-^ \* the License.  You may obtain a copy of the License at$
-^ \*$
-^ \*      http://www.apache.org/licenses/LICENSE-2.0$
-^ \*$
-^ \* Unless required by applicable law or agreed to in writing, software$
-^ \* distributed under the License is distributed on an "AS IS" BASIS,$
-^ \* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.$
-^ \* See the License for the specific language governing permissions and$
-^ \* limitations under the License.$
-^ \*/$
-^$
\ No newline at end of file
diff --git a/other/checkstyle-rules/src/main/resources/tobago/checkstyle-strict.xml b/other/checkstyle-rules/src/main/resources/tobago/checkstyle-strict.xml
deleted file mode 100644
index eaa671c..0000000
--- a/other/checkstyle-rules/src/main/resources/tobago/checkstyle-strict.xml
+++ /dev/null
@@ -1,245 +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.
--->
-
-<!DOCTYPE module PUBLIC
-    "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
-    "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
-
-<!--
-
-  Checkstyle configuration that checks the sun coding conventions from:
-
-    - the Java Language Specification at
-      http://java.sun.com/docs/books/jls/second_edition/html/index.html
-
-    - the Sun Code Conventions at http://java.sun.com/docs/codeconv/
-
-    - the Javadoc guidelines at
-      http://java.sun.com/j2se/javadoc/writingdoccomments/index.html
-
-    - the JDK Api documentation http://java.sun.com/j2se/docs/api/index.html
-
-    - some best practices
-
-  Checkstyle is very configurable. Be sure to read the documentation at
-  http://checkstyle.sf.net (or in your downloaded distribution).
-
-  Most Checks are configurable, be sure to consult the documentation.
-
-  To completely disable a check, just comment it out or delete it from the file.
-
-  Finally, it is worth reading the documentation.
-
--->
-
-<module name="Checker">
-
-  <!-- Checks that a package.html file exists for each package.     -->
-  <!-- See http://checkstyle.sf.net/config_javadoc.html#PackageHtml -->
-
-  <!-- Checks whether files end with a new line.                        -->
-  <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
-  <module name="NewlineAtEndOfFile"/>
-
-  <!-- Checks that property files contain the same keys.         -->
-  <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
-  <module name="Translation"/>
-
-
-  <module name="TreeWalker">
-
-    <property name="cacheFile" value="${checkstyle.cache.file}"/>
-    <property name="charset" value="UTF-8"/>
-    <property name="tabWidth" value="2"/>
-
-    <!-- Checks for Javadoc comments.                     -->
-    <!-- See http://checkstyle.sf.net/config_javadoc.html
-        <module name="JavadocMethod"/>
-        <module name="JavadocType"/>
-        <module name="JavadocVariable"/>
-        <module name="JavadocStyle"/>   -->
-
-
-
-
-    <!-- Checks for Naming Conventions.                  -->
-    <!-- See http://checkstyle.sf.net/config_naming.html -->
-    <module name="ConstantName"/>
-    <module name="LocalFinalVariableName"/>
-    <module name="LocalVariableName"/>
-    <module name="MemberName"/>
-    <module name="MethodName"/>
-    <module name="PackageName"/>
-    <module name="ParameterName"/>
-    <module name="StaticVariableName"/>
-    <module name="TypeName"/>
-
-
-
-
-    <!-- Checks for Headers                                -->
-    <!-- See http://checkstyle.sf.net/config_header.html   -->
-    <!-- <module name="Header"> -->
-    <!-- The follow property value demonstrates the ability     -->
-    <!-- to have access to ANT properties. In this case it uses -->
-    <!-- the ${basedir} property to allow Checkstyle to be run  -->
-    <!-- from any directory within a project. See property      -->
-    <!-- expansion,                                             -->
-    <!-- http://checkstyle.sf.net/config.html#properties        -->
-    <!-- <property                                              -->
-    <!--     name="headerFile"                                  -->
-    <!--     value="${basedir}/java.header"/> -->
-    <!-- Following interprets the header file as regular expressions. -->
-    <!-- </module> -->
-
-    <module name="RegexpHeader">
-      <property name="headerFile" value="${checkstyle.header.file}"/>
-      <!--<property name="header" value="^package \n^$\n/\*$\n^ \* Copyright \d\d\d\d-\d\d\d\d The Apache Software Foundation.$\n^ \*$\n^ \* Licensed under the Apache License, Version 2.0 \(the &quot;License&quot;\)\;$\n^ \* you may not use this file except in compliance with the License.$\n^ \* You may obtain a copy of the License at$\n^ \*$\n^ \*      http://www.apache.org/licenses/LICENSE-2.0$\n^ \*$\n^ \* Unless required by applicable law or agreed to in writing, software$\n^ \* distributed under the License is distributed on an &quot;AS IS&quot; BASIS,$\n^ \* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.$\n^ \* See the License for the specific language governing permissions and$\n^ \* limitations under the License.$\n^ \*/$\n^$"/>-->
-    </module>
-
-
-
-
-
-    <!-- Checks for imports                              -->
-    <!-- See http://checkstyle.sf.net/config_import.html -->
-    <module name="AvoidStarImport"/>
-    <module name="IllegalImport"/> <!-- defaults to sun.* packages -->
-    <module name="RedundantImport"/>
-    <module name="UnusedImports"/>
-
-
-    <!-- Checks for Size Violations.                    -->
-    <!-- See http://checkstyle.sf.net/config_sizes.html -->
-    <module name="FileLength"/>
-    <module name="LineLength">
-      <property name="max" value="120"/>
-    </module>
-    <module name="MethodLength"/>
-    <module name="ParameterNumber"/>
-
-
-    <!-- Checks for whitespace                               -->
-    <!-- See http://checkstyle.sf.net/config_whitespace.html -->
-    <module name="EmptyForIteratorPad"/>
-    <module name="MethodParamPad"/>
-    <module name="NoWhitespaceAfter"/>
-    <module name="NoWhitespaceBefore"/>
-    <module name="OperatorWrap"/>
-    <module name="ParenPad"/>
-    <module name="TypecastParenPad"/>
-    <module name="TabCharacter"/>
-    <module name="WhitespaceAfter"/>
-    <!--<module name="WhitespaceAround"/>-->
-
-    <!-- Modifier Checks                                    -->
-    <!-- See http://checkstyle.sf.net/config_modifiers.html -->
-    <module name="ModifierOrder"/>
-    <module name="RedundantModifier"/>
-
-
-    <!-- Checks for blocks. You know, those {}'s         -->
-    <!-- See http://checkstyle.sf.net/config_blocks.html -->
-    <module name="AvoidNestedBlocks"/>
-    <module name="EmptyBlock"/>
-    <module name="LeftCurly"/>
-    <module name="NeedBraces"/>
-    <module name="RightCurly"/>
-
-
-    <!-- Checks for common coding problems               -->
-    <!-- See http://checkstyle.sf.net/config_coding.html -->
-    <!-- <module name="AvoidInlineConditionals"/> -->
-    <module name="CovariantEquals"/>
-    <module name="DoubleCheckedLocking"/>    <!-- MY FAVOURITE -->
-    <module name="EmptyStatement"/>
-    <module name="EqualsHashCode"/>
-    <module name="HiddenField">
-      <property name="ignoreSetter" value="true" />
-      <property name=" ignoreConstructorParameter" value="true" />
-    </module>
-    <module name="IllegalInstantiation">
-      <property name="classes" value="java.lang.Boolean, java.lang.String"/>
-    </module>
-    <module name="InnerAssignment"/>
-    <!-- <module name="MagicNumber"/> -->
-    <module name="MissingSwitchDefault"/>
-    <module name="RedundantThrows">
-      <property name="allowUnchecked" value="true"/>
-    </module>
-    <module name="StringLiteralEquality"/>
-    <module name="SimplifyBooleanExpression"/>
-    <module name="SimplifyBooleanReturn"/>
-    <module name="SuperClone"/>
-    <module name="SuperFinalize"/>
-    <module name="IllegalThrows"/>
-    <module name="PackageDeclaration"/>
-    <module name="DeclarationOrder"/>
-    <module name="ParameterAssignment"/>
-    <module name="DeclarationOrder"/>
-    <module name="MultipleVariableDeclarations"/>
-    <module name="UnnecessaryParentheses"/>
-
-    <!-- Checks for class design                         -->
-    <!-- See http://checkstyle.sf.net/config_design.html -->
-    <!-- module name="DesignForExtension"/ -->
-    <!-- module name="FinalClass"/ -->
-    <!-- module name="HideUtilityClassConstructor"/ -->
-
-    <module name="InterfaceIsType"/>
-    <module name="VisibilityModifier"/>
-
-
-    <!-- Miscellaneous other checks.                   -->
-    <!-- See http://checkstyle.sf.net/config_misc.html -->
-    <module name="ArrayTypeStyle"/>
-    <!--<module name="FinalParameters"/> -->
-    <!-- Line with Trailing Spaces (disabled as it's to noisy)
-        <module name="GenericIllegalRegexp">
-          <property name="format" value="\s+$"/>
-          <property name="message" value="Line has trailing spaces."/>
-        </module>
-        -->
-
-    <!-- Let todo plugin handle this.
-        <module name="TodoComment"/>
-        -->
-
-    <module name="GenericIllegalRegexp">
-      <property name="format" value="((public)|(protected))\s+void\s+finalize\(\s*\)"/>
-      <property name="message" value="Avoid finalizers"/>
-    </module>
-    <!-- No direct printing to System.out or System.err -->
-
-
-    <module name="GenericIllegalRegexp">
-      <property name="format" value="System\.(out|err)\."/>
-      <property name="message" value="Don't write directly to System.out our System.err"/>
-    </module>
-    <!-- No @author tags -->
-    <module name="GenericIllegalRegexp">
-      <property name="format" value="@author"/>
-      <property name="message" 	value="No @author tag allowed"/>
-    </module>
-
-
-    <module name="UpperEll"/>
-
-  </module>
-
-</module>
diff --git a/other/checkstyle-rules/src/main/resources/tobago/checkstyle.xml b/other/checkstyle-rules/src/main/resources/tobago/checkstyle.xml
deleted file mode 100644
index 731572d..0000000
--- a/other/checkstyle-rules/src/main/resources/tobago/checkstyle.xml
+++ /dev/null
@@ -1,252 +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.
--->
-
-<!DOCTYPE module PUBLIC
-    "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
-    "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
-
-<!--
-
-  Checkstyle configuration that checks the sun coding conventions from:
-
-    - the Java Language Specification at
-      http://java.sun.com/docs/books/jls/second_edition/html/index.html
-
-    - the Sun Code Conventions at http://java.sun.com/docs/codeconv/
-
-    - the Javadoc guidelines at
-      http://java.sun.com/j2se/javadoc/writingdoccomments/index.html
-
-    - the JDK Api documentation http://java.sun.com/j2se/docs/api/index.html
-
-    - some best practices
-
-  Checkstyle is very configurable. Be sure to read the documentation at
-  http://checkstyle.sf.net (or in your downloaded distribution).
-
-  Most Checks are configurable, be sure to consult the documentation.
-
-  To completely disable a check, just comment it out or delete it from the file.
-
-  Finally, it is worth reading the documentation.
-
--->
-
-<module name="Checker">
-
-    <!-- Checks that a package.html file exists for each package.     -->
-    <!-- See http://checkstyle.sf.net/config_javadoc.html#PackageHtml -->
-
-    <!-- Checks whether files end with a new line.                        -->
-    <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
-    <module name="NewlineAtEndOfFile"/>
-
-    <!-- Checks that property files contain the same keys.         -->
-    <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
-    <module name="Translation"/>
-
-
-    <module name="TreeWalker">
-
-        <property name="cacheFile" value="${checkstyle.cache.file}"/>
-        <property name="charset" value="UTF-8"/>
-        <property name="tabWidth" value="2"/>
-
-        <!-- Checks for Javadoc comments.                     -->
-        <!-- See http://checkstyle.sf.net/config_javadoc.html
-        <module name="JavadocMethod"/>
-        <module name="JavadocType"/>
-        <module name="JavadocVariable"/>
-        <module name="JavadocStyle"/>   -->
-
-
-
-
-        <!-- Checks for Naming Conventions.                  -->
-        <!-- See http://checkstyle.sf.net/config_naming.html -->
-        <module name="ConstantName"/>
-        <module name="LocalFinalVariableName"/>
-        <module name="LocalVariableName"/>
-        <module name="MemberName"/>
-        <module name="MethodName"/>
-        <module name="PackageName"/>
-        <module name="ParameterName"/>
-        <module name="StaticVariableName"/>
-        <module name="TypeName"/>
-
-
-
-
-        <!-- Checks for Headers                                -->
-        <!-- See http://checkstyle.sf.net/config_header.html   -->
-        <!-- <module name="Header"> -->
-            <!-- The follow property value demonstrates the ability     -->
-            <!-- to have access to ANT properties. In this case it uses -->
-            <!-- the ${basedir} property to allow Checkstyle to be run  -->
-            <!-- from any directory within a project. See property      -->
-            <!-- expansion,                                             -->
-            <!-- http://checkstyle.sf.net/config.html#properties        -->
-            <!-- <property                                              -->
-            <!--     name="headerFile"                                  -->
-            <!--     value="${basedir}/java.header"/> -->
-            <!-- Following interprets the header file as regular expressions. -->
-        <!-- </module> -->
-
-         <module name="RegexpHeader">
-           <property name="headerFile" value="${checkstyle.header.file}"/>
-             <!--<property name="header" value="^package \n^$\n/\*$\n^ \* Copyright (\d\d\d\d-)?\d\d\d\d The Apache Software Foundation.$\n^ \*$\n^ \* Licensed under the Apache License, Version 2.0 \(the &quot;License&quot;\)\;$\n^ \* you may not use this file except in compliance with the License.$\n^ \* You may obtain a copy of the License at$\n^ \*$\n^ \*      http://www.apache.org/licenses/LICENSE-2.0$\n^ \*$\n^ \* Unless required by applicable law or agreed to in writing, software$\n^ \* distributed under the License is distributed on an &quot;AS IS&quot; BASIS,$\n^ \* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.$\n^ \* See the License for the specific language governing permissions and$\n^ \* limitations under the License.$\n^ \*/$\n^$"/>-->
-         </module>
-
-
-
-
-
-        <!-- Checks for imports                              -->
-        <!-- See http://checkstyle.sf.net/config_import.html -->
-        <module name="AvoidStarImport"/>
-        <module name="IllegalImport"/> <!-- defaults to sun.* packages -->
-        <module name="RedundantImport"/>
-        <module name="UnusedImports"/>
-
-
-        <!-- Checks for Size Violations.                    -->
-        <!-- See http://checkstyle.sf.net/config_sizes.html -->
-        <module name="FileLength"/>
-        <module name="LineLength">
-          <property name="max" value="120"/>
-        </module>
-        <!--<module name="MethodLength"/>-->
-        <module name="ParameterNumber">
-          <property name="max" value="15"/>
-        </module>
-
-
-        <!-- Checks for whitespace                               -->
-        <!-- See http://checkstyle.sf.net/config_whitespace.html -->
-        <module name="EmptyForIteratorPad"/>
-        <module name="MethodParamPad"/>
-        <module name="NoWhitespaceAfter"/>
-        <module name="NoWhitespaceBefore"/>
-        <module name="OperatorWrap"/>
-        <module name="ParenPad"/>
-        <module name="TypecastParenPad"/>
-        <module name="TabCharacter"/>
-        <module name="WhitespaceAfter"/>
-        <!--<module name="WhitespaceAround"/>-->
-
-        <!-- Modifier Checks                                    -->
-        <!-- See http://checkstyle.sf.net/config_modifiers.html -->
-        <module name="ModifierOrder"/>
-        <module name="RedundantModifier"/>
-
-
-        <!-- Checks for blocks. You know, those {}'s         -->
-        <!-- See http://checkstyle.sf.net/config_blocks.html -->
-        <module name="AvoidNestedBlocks">
-          <property name="allowInSwitchCase" value="true"/>
-        </module>
-        <module name="EmptyBlock">
-          <property name="option" value="text"/>
-          <property name="tokens" value="LITERAL_CATCH"/>
-        </module>
-        <module name="LeftCurly"/>
-        <module name="NeedBraces"/>
-        <module name="RightCurly"/>
-
-
-        <!-- Checks for common coding problems               -->
-        <!-- See http://checkstyle.sf.net/config_coding.html -->
-        <!-- <module name="AvoidInlineConditionals"/> -->
-        <module name="CovariantEquals"/>
-        <module name="DoubleCheckedLocking"/>    <!-- MY FAVOURITE -->
-        <!--<module name="EmptyStatement"/>-->
-        <module name="EqualsHashCode"/>
-        <!--module name="HiddenField">
-          <property name="ignoreSetter" value="true" />
-          <property name=" ignoreConstructorParameter" value="true" />
-        </module-->
-        <module name="IllegalInstantiation">
-           <property name="classes" value="java.lang.Boolean, java.lang.String"/>
-        </module>
-        <module name="InnerAssignment"/>
-        <!-- <module name="MagicNumber"/> -->
-        <module name="MissingSwitchDefault"/>
-        <module name="RedundantThrows">
-          <property name="allowUnchecked" value="true"/>
-        </module>
-        <module name="StringLiteralEquality"/>
-        <module name="SimplifyBooleanExpression"/>
-        <module name="SimplifyBooleanReturn"/>
-        <module name="SuperClone"/>
-        <module name="SuperFinalize"/>
-        <module name="IllegalThrows"/>
-        <module name="PackageDeclaration"/>
-        <module name="MultipleVariableDeclarations"/>
-
-        <!-- Checks for class design                         -->
-        <!-- See http://checkstyle.sf.net/config_design.html -->
-        <!-- module name="DesignForExtension"/ -->
-        <!-- module name="FinalClass"/ -->
-        <!-- module name="HideUtilityClassConstructor"/ -->
-
-        <module name="InterfaceIsType"/>
-        <module name="VisibilityModifier"/>
-
-
-        <!-- Miscellaneous other checks.                   -->
-        <!-- See http://checkstyle.sf.net/config_misc.html -->
-        <module name="ArrayTypeStyle"/>
-        <!--<module name="FinalParameters"/> -->
-        <!-- Line with Trailing Spaces (disabled as it's to noisy)
-        <module name="GenericIllegalRegexp">
-          <property name="format" value="\s+$"/>
-          <property name="message" value="Line has trailing spaces."/>
-        </module>
-        -->
-
-        <!-- Let todo plugin handle this.
-        <module name="TodoComment"/>
-        -->
-
-        <module name="GenericIllegalRegexp">
- 	        <property name="format" value="((public)|(protected))\s+void\s+finalize\(\s*\)"/>
-	        <property name="message" value="Avoid finalizers"/>
-        </module>
-	      <!-- No direct printing to System.out or System.err -->
-
-
- 	      <module name="GenericIllegalRegexp">
- 	        <property name="format" value="System\.(out|err)\."/>
- 	        <property name="message" value="Don't write directly to System.out our System.err"/>
- 	      </module>
-	 	    <!-- No @author tags -->
- 	      <module name="GenericIllegalRegexp">
- 	        <property name="format" value="@author"/>
- 	        <property name="message" 	value="No @author tag allowed"/>
- 	      </module>
-
-        <module name="GenericIllegalRegexp">
- 	        <property name="format" value="strählekreuzen"/>
- 	        <property name="message" 	value="No strählekreuzen allowed"/>
- 	      </module>
-
-        <module name="UpperEll"/>
-
-    </module>
-
-</module>
diff --git a/other/normalizer/README.txt b/other/normalizer/README.txt
deleted file mode 100644
index 2ae1b64..0000000
--- a/other/normalizer/README.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-This project is a simple command-line tool that "normalises" a JSP TLD file or a JSF faces-config file.
-After two files have been "normalized", they can then be compared with a simple "diff" tool to see what
-real differences (if any) there are between the two original files.
-
-All "non-critical" data, like comments and "description" fields are discarded. 
-All xml elements and attributes are then sorted into a consistent order:
- * elements with just text content are sorted before others.
- * elements are sorted alphabetically by element name
- * elements with same name are sorted according to the text content of their child nodes
-   (means that <tag><name>foo</name></tag> is sorted on the content of the name child).
- 
-This tool is partly a generic XML "normaliser", but takes a few shortcuts that work specifically
-on TLD and faces-config files. It could possibly be expanded to support comparison of other xml
-files, but wasn't specifically designed for that purpose. And it is definitely a "hack"; a tool
-that is just complex enough for its purpose but not elegant. For example:
-* "mixed content" elements are just not supported
-* xml namespaces are not handled properly
-* external dtds and entity references are ignored
\ No newline at end of file
diff --git a/other/normalizer/norm b/other/normalizer/norm
deleted file mode 100755
index 6cfe542..0000000
--- a/other/normalizer/norm
+++ /dev/null
@@ -1 +0,0 @@
-java -cp target/classes org.apache.myfaces.buildtools.normalizer.Normalizer $@
diff --git a/other/normalizer/pom.xml b/other/normalizer/pom.xml
deleted file mode 100644
index 8cbcc80..0000000
--- a/other/normalizer/pom.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<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.myfaces.buildtools</groupId>
-  <artifactId>normalizer</artifactId>
-  <packaging>jar</packaging>
-  <version>1.0-SNAPSHOT</version>
-  <name>normalizer</name>
-  <url>http://maven.apache.org</url>
-  <dependencies>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>3.8.1</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/other/normalizer/src/main/java/org/apache/myfaces/buildtools/normalizer/Attribute.java b/other/normalizer/src/main/java/org/apache/myfaces/buildtools/normalizer/Attribute.java
deleted file mode 100644
index ff2a77d..0000000
--- a/other/normalizer/src/main/java/org/apache/myfaces/buildtools/normalizer/Attribute.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.apache.myfaces.buildtools.normalizer;
-
-import java.io.PrintWriter;
-
-public class Attribute implements Comparable
-{
-    String name;
-    String value;
-
-    public Attribute(String name, String value)
-    {
-        this.name = name;
-        this.value = value;
-    }
-
-    public void print(PrintWriter writer)
-    {
-        writer.append(name);
-        writer.append("=");
-        writer.append("\"");
-        writer.append(value);
-        writer.append("\"");
-    }
-
-    public int compareTo(Object other)
-    {
-        Attribute otherAttr = (Attribute) other;
-        return name.compareTo(otherAttr.name);
-    }    
-}
\ No newline at end of file
diff --git a/other/normalizer/src/main/java/org/apache/myfaces/buildtools/normalizer/Element.java b/other/normalizer/src/main/java/org/apache/myfaces/buildtools/normalizer/Element.java
deleted file mode 100644
index 9b96561..0000000
--- a/other/normalizer/src/main/java/org/apache/myfaces/buildtools/normalizer/Element.java
+++ /dev/null
@@ -1,206 +0,0 @@
-package org.apache.myfaces.buildtools.normalizer;
-
-import java.io.PrintWriter;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Represent an XML element which has either body text or a list of child elements.
- * <p>
- * Mixed-content elements are not supported. Namespaces are ignored.
- */
-public class Element implements Comparable
-{
-    static String[] SORT_PRIORITY_HIGH = new String[]
-    {
-        "name",
-    };
-    
-    static String[] SORT_PRIORITY_LOW = new String[]
-    {
-        "class"
-    };
-
-    String name;
-    Attribute[] attributes;
-    String content;
-    List children = new LinkedList();
-    
-    // Value used to choose ordering for two elements with different names.
-    // Elements whose name matches a "high priority" pattern are output before
-    // elements with "normal" names, which are output before elements whose
-    // names match a "low priority" pattern.
-    int sortPriority = 0;
-
-    // Value used to choose ordering for two elements that have the same
-    // name and no text content. This is built from the text content of
-    // the (ordered) set of child elements, so that two nodes with similar
-    // child elements get sorted in the same order.
-    String sortKey = null;
-
-    // The attributes array is expected to be sorted before passing in here.
-    public Element(String name, Attribute[] attributes)
-    {
-        this.name = name;
-        this.attributes = attributes;
-        sortPriority = getSortPriority(name);
-    }
-
-    public void setContent(String content)
-    {
-        this.content = content;
-    }
-    
-    public void addChild(Element child)
-    {
-        children.add(child);
-    }
-
-    public void sortChildren()
-    {
-        if (children.isEmpty())
-        {
-            // Nothing to sort here.
-            if (content == null)
-                sortKey = ""; // should never happen
-            else
-                sortKey = content;
-            return;
-        }
-
-        // first ensure each child is internally sorted
-        for(Iterator i = children.iterator(); i.hasNext(); )
-        {
-            ((Element) i.next()).sortChildren();
-        }
-
-        // now sort the list of children relative to each other
-        Collections.sort(children);
-
-        // Compute the sortKey for this element, used when
-        // two elements have identical names and therefore need
-        // to be ordered according to the content of their
-        // child elements.
-        StringBuffer buf = new StringBuffer();
-        for(Iterator i = children.iterator(); i.hasNext(); )
-        {
-            Element child = (Element) i.next();
-            if (buf.length() == 0)
-            {
-                buf.append("&");
-            }
-            buf.append(child.sortKey);
-        }
-        sortKey = buf.toString();
-    }
-
-    public void print(PrintWriter writer, int indentAmount)
-    {
-        Utils.indent(writer, indentAmount);
-        writer.append("<");
-        writer.append(name);
-        if (attributes != null)
-        {
-            for(int i=0; i<attributes.length; ++i)
-            {
-                writer.append(" ");
-                attributes[i].print(writer);
-            }
-        }
-
-        if (content != null)
-        {
-            writer.append(">");
-            writer.append(content);
-            writer.append("</");
-            writer.append(name);
-            writer.append(">\n");
-        }
-        else if (children.size() == 0)
-        {
-            writer.append("/>\n");
-        }
-        else
-        {
-            writer.append(">\n");
-            for(Iterator i = children.iterator(); i.hasNext();)
-            {
-                Element e = (Element)i.next();
-                e.print(writer, indentAmount+1);
-            }
-            Utils.indent(writer, indentAmount);
-            writer.append("</");
-            writer.append(name);
-            writer.append(">\n");
-        }
-    }
-
-    /**
-     * Return a value that indicates how this element should be sorted relative to
-     * other elements.
-     * <p>
-     * This method is not safe to call until after sortChildren() has been invoked.
-     */
-    public int compareTo(Object other)
-    {
-        Element otherElement = (Element) other;
-
-        // Sort tags with just text content before ones with child elements
-        if (this.children.isEmpty() && !otherElement.children.isEmpty())
-            return -1;
-        else if (!this.children.isEmpty() && otherElement.children.isEmpty())
-            return +1;
-
-        if (name.equals(otherElement.name))
-        {
-            // Ok, we have two tags with the same name and both have child elements.
-            // Sort by the sortkey we computed during the sortChildren method
-            return sortKey.compareTo(otherElement.sortKey);
-        }
-
-        // Names are different: check whether either name has special priority.
-        if (sortPriority != otherElement.sortPriority)
-        {
-            return otherElement.sortPriority - sortPriority;
-        }
-
-        // Ok, different names and the priority of the name is equal.
-        // So just sort alphabetically.
-        return name.compareTo(otherElement.name);
-    }
-
-    /**
-     * Return the "priority" of this name.
-     * <p>
-     * Names with higher priority are sorted earlier in the list of elements.
-     * And as elements with equal names are sorted according to the contents
-     * of their children, this also affects the sorting order of the parent
-     * element of an element that has a "priority" value.
-     * <p>
-     * Normal element names have zero priority.
-     */
-    private int getSortPriority(String ename)
-    {
-        for(int i=0; i<SORT_PRIORITY_HIGH.length; ++i)
-        {
-            if (ename.contains(SORT_PRIORITY_HIGH[i]))
-            {
-                // always positive
-                return SORT_PRIORITY_HIGH.length - i;
-            }
-        }
-
-        for(int i=0; i<SORT_PRIORITY_LOW.length; ++i)
-        {
-            if (ename.contains(SORT_PRIORITY_LOW[i]))
-            {
-                // always negative
-                return i - SORT_PRIORITY_LOW.length;
-            }
-        }
-        
-        return 0;
-    }
-}
diff --git a/other/normalizer/src/main/java/org/apache/myfaces/buildtools/normalizer/Normalizer.java b/other/normalizer/src/main/java/org/apache/myfaces/buildtools/normalizer/Normalizer.java
deleted file mode 100644
index b0be9b9..0000000
--- a/other/normalizer/src/main/java/org/apache/myfaces/buildtools/normalizer/Normalizer.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package org.apache.myfaces.buildtools.normalizer;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Stack;
-
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * Read input file and write it out with everything normalized.
- */
-public class Normalizer extends DefaultHandler
-{
-    Stack elements = new Stack();
-    Element rootElement = null;
-    StringBuffer currContent = new StringBuffer();
-
-    public static void main( String[] args ) throws Exception
-    {
-        if (args.length < 1)
-        {
-            System.out.println("Usage: App inputFile");
-            System.exit(-1);
-        }
-        
-        new Normalizer().process(args[0]);
-    }
-    
-    private void process(String filename) throws Exception
-    {
-        SAXParserFactory factory = SAXParserFactory.newInstance();
-        SAXParser parser = factory.newSAXParser();
-
-        File f = new File(filename);
-
-        parser.parse(f, this);
-        rootElement.sortChildren();
-        PrintWriter pw = new PrintWriter(System.out);
-        rootElement.print(pw, 0);
-        pw.flush();
-    }
-
-    private static final Attribute[] EMPTY_ATTRS = new Attribute[0];
-
-    // Ignore any external entities. In particular, this skips the reading of dtds.
-    public InputSource resolveEntity(String publicId, String systemId)
-     throws IOException, SAXException
-    {
-        InputStream is = new ByteArrayInputStream(new byte[0]);
-        return new InputSource(is);
-    }
-            
-    public void startElement(String uri, String localName, String qname, Attributes attributes)
-    {
-        int nAttrs = attributes.getLength();
-        List attrList = new ArrayList(nAttrs);
-        for(int i=0; i<nAttrs; ++i) {
-            String name = attributes.getQName(i);
-            String value = attributes.getValue(i);
-            Attribute a = new Attribute(name, value);
-            attrList.add(a);
-        }
-        Collections.sort(attrList);
-
-        Attribute[] attrs = (Attribute[]) attrList.toArray(EMPTY_ATTRS); 
-        Element e = new Element(qname, attrs);
-
-        Element parent;
-        if (elements.isEmpty())
-        {
-            rootElement = e;
-        }
-        else if (!qname.equals("description"))
-        {
-            parent = (Element) elements.peek();
-            parent.addChild(e);
-        }
-        elements.push(e);
-
-        // check whether currContent is already non-whitespace.
-        // if it is, then throw an exception about "mixed content not supported"
-        currContent.setLength(0);
-    }
-
-    public void endElement(String uri, String localName, String qname)
-    {
-        String s = currContent.toString().trim();
-        if (!s.isEmpty())
-        {
-            getCurrElement().setContent(s);
-        }
-        currContent.setLength(0);
-
-        elements.pop();
-    }
-
-    public void characters(char[] ch, int start, int length)
-    {
-        currContent.append(ch, start, length);
-    }
-    
-    private Element getCurrElement()
-    {
-        return (Element) elements.peek();
-    }
-}
diff --git a/other/normalizer/src/main/java/org/apache/myfaces/buildtools/normalizer/NullInputSource.java b/other/normalizer/src/main/java/org/apache/myfaces/buildtools/normalizer/NullInputSource.java
deleted file mode 100644
index 8e21739..0000000
--- a/other/normalizer/src/main/java/org/apache/myfaces/buildtools/normalizer/NullInputSource.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.apache.myfaces.buildtools.normalizer;
-
-
-public class NullInputSource extends org.xml.sax.InputSource
-{
-    public NullInputSource(String pubId, String sysId)
-    {
-        
-    }
-}
\ No newline at end of file
diff --git a/other/normalizer/src/main/java/org/apache/myfaces/buildtools/normalizer/Utils.java b/other/normalizer/src/main/java/org/apache/myfaces/buildtools/normalizer/Utils.java
deleted file mode 100644
index af0c76e..0000000
--- a/other/normalizer/src/main/java/org/apache/myfaces/buildtools/normalizer/Utils.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.apache.myfaces.buildtools.normalizer;
-
-import java.io.PrintWriter;
-
-
-/**
- * Read input file and write it out with everything normalized.
- */
-public class Utils 
-{
-    public static void indent(PrintWriter writer, int amount)
-    {
-        for(int i=0; i<amount; ++i)
-            writer.write("  ");
-    }
-}
diff --git a/other/normalizer/src/test/java/org/apache/myfaces/buildtools/normalizer/NormalizerTest.java b/other/normalizer/src/test/java/org/apache/myfaces/buildtools/normalizer/NormalizerTest.java
deleted file mode 100644
index 7cbed52..0000000
--- a/other/normalizer/src/test/java/org/apache/myfaces/buildtools/normalizer/NormalizerTest.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.apache.myfaces.buildtools.normalizer;
-
-import junit.framework.TestCase;
-
-/**
- * Unit test for Normalizer.
- */
-public class NormalizerTest extends TestCase
-{
-    /**
-     * Rigorous Test :-)
-     */
-    public void testNormalizer()
-    {
-        // TODO: write some real tests here
-        assertTrue( true );
-    }
-}
diff --git a/other/scripts/README.txt b/other/scripts/README.txt
deleted file mode 100644
index a0f2d03..0000000
--- a/other/scripts/README.txt
+++ /dev/null
@@ -1 +0,0 @@
-This directory holds useful development scripts.
diff --git a/other/scripts/detab.sh b/other/scripts/detab.sh
deleted file mode 100755
index a778a7c..0000000
--- a/other/scripts/detab.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-# Unix/Linux shell script to clean up whitespace in all .java files in a directory.
-#
-# All tabs found are replaced with 4 spaces.
-#
-# Add the following to also remove trailing whitespace from all lines:
-#    -e "s/\s\s*$//"  \
-find . -name ".svn" -prune -o -name "*.java" -exec \
-  sed --in-place \
-    -e "s/\t/    /g"  \
-  {} \;
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..387aaa5
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright 2006 The Apache Software Foundation.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<!--
+  - The archetypes project defines a set of maven archetype plugins that can be
+  - used to create an initial directory tree of files when starting a new JSF
+  - project.
+  -
+  - This pom is used:
+  - * as the parent pom for all individual archetype modules, to define common settings
+  - * to define the common archetype website
+  - * as a convenient tool for building all the archetype projects.
+  -->
+<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>
+    <groupId>org.apache.myfaces</groupId>
+    <artifactId>myfaces</artifactId>
+    <version>5</version>
+  </parent>
+
+  <groupId>org.apache.myfaces.buildtools</groupId>
+  <artifactId>myfaces-archetype-parent</artifactId>
+  <version>1.0.2</version>
+  <packaging>pom</packaging>
+  <name>Apache MyFaces Buildtools Maven2 Archetype Parent</name>
+  <url>http://myfaces.apache.org/build-tools/archetypes</url>
+
+  <issueManagement>
+    <system>jira</system>
+    <url>http://issues.apache.org/jira/browse/MYFACES</url>
+  </issueManagement>
+
+  <ciManagement>
+    <system>continuum</system>
+    <url>http://myfaces.zones.apache.org:8080/continuum</url>
+    <notifiers>
+      <notifier>
+        <type>mail</type>
+        <sendOnSuccess>true</sendOnSuccess>
+        <configuration>
+          <address>commits@myfaces.apache.org</address>
+        </configuration>
+      </notifier>
+    </notifiers>
+  </ciManagement>
+
+  <inceptionYear>2008</inceptionYear>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${basedir}</directory>
+        <targetPath>META-INF</targetPath>
+        <includes>
+          <include>NOTICE.txt</include>
+          <include>LICENSE.txt</include>
+        </includes>
+      </resource>
+      <resource>
+        <directory>${basedir}/src/main/resources</directory>
+      </resource>
+    </resources>
+
+    <pluginManagement>
+      <plugins>
+	<plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-plugin-plugin</artifactId>
+          <!-- 2.4 throws error, so temporally put on 2.3 -->
+          <version>2.3</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-jar-plugin</artifactId>
+          <version>2.2</version>
+          <configuration>
+            <archive>
+              <manifest>
+                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+              </manifest>
+            </archive>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+
+  </build>
+
+  <reporting>
+    <plugins>
+      <plugin>
+        <artifactId>maven-project-info-reports-plugin</artifactId>
+        <version>2.0.1</version>
+      </plugin>
+      <plugin>
+        <artifactId>maven-pmd-plugin</artifactId>
+        <version>2.3</version>
+        <configuration>
+          <rulesets>
+            <ruleset>/rulesets/basic.xml</ruleset>
+            <ruleset>/rulesets/unusedcode.xml</ruleset>
+          </rulesets>
+          <linkXref>true</linkXref>
+          <minimumTokens>100</minimumTokens>
+          <targetJdk>1.5</targetJdk>
+        </configuration>
+      </plugin>
+    </plugins>
+  </reporting>
+
+  <scm>
+    <connection>scm:svn:http://svn.apache.org/repos/asf/myfaces/myfaces-build-tools/branches/lu4242_m2_archetypes_102_release</connection>
+    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/myfaces/myfaces-build-tools/branches/lu4242_m2_archetypes_102_release</developerConnection>
+    <url>http://svn.apache.org/viewvc/myfaces/myfaces-build-tools/branches/lu4242_m2_archetypes_102_release</url>
+  </scm>
+
+  <modules>
+    <module>myfaces-archetype-helloworld</module>
+    <module>myfaces-archetype-helloworld-facelets</module>
+    <module>myfaces-archetype-helloworld-portlets</module>
+    <module>myfaces-archetype-trinidad</module>
+    <module>myfaces-archetype-jsfcomponents</module>
+  </modules>
+
+  <distributionManagement>
+    <snapshotRepository>
+      <uniqueVersion>false</uniqueVersion>
+      <id>apache.snapshots</id>
+      <name>Apache Maven Snapshot Repository</name>
+      <url>scpexe://people.apache.org/www/people.apache.org/repo/m2-snapshot-repository</url>
+    </snapshotRepository>
+    <site>
+      <id>apache-site</id>
+      <url>scpexe://people.apache.org/www/myfaces.apache.org/build-tools/archetypes</url>
+    </site>
+  </distributionManagement>
+
+  <profiles>
+    <profile>
+      <id>release</id>
+      <!--
+      NOTE: Execute this profile like
+            mvn clean source:jar install deploy -DaltDeploymentRepository=matzew::default::file://FOLDER -Prelease
+       -->
+      <build>
+        <plugins>
+          <plugin>
+            <artifactId>maven-gpg-plugin</artifactId>
+            <version>1.0-alpha-4</version>
+            <executions>
+              <execution>
+                <id>sign-artifacts</id>
+                <phase>verify</phase>
+                <goals>
+                  <goal>sign</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <artifactId>maven-javadoc-plugin</artifactId>
+            <version>2.3</version>
+            <executions>
+              <execution>
+                <id>attach-javadocs</id>
+                <goals>
+                  <goal>jar</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <artifactId>maven-scm-plugin</artifactId>
+            <version>1.0</version>
+            <executions>
+              <execution>
+                <phase>validate</phase>
+                <id>getting-scm.revision</id>
+                <goals>
+                  <goal>update</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+</project>
diff --git a/maven2-archetypes/src/site/apt/index.apt b/src/site/apt/index.apt
similarity index 100%
rename from maven2-archetypes/src/site/apt/index.apt
rename to src/site/apt/index.apt
diff --git a/maven2-archetypes/src/site/site.xml b/src/site/site.xml
similarity index 100%
rename from maven2-archetypes/src/site/site.xml
rename to src/site/site.xml
