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-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/maven2-archetypes/myfaces-archetype-helloworld-facelets/pom.xml b/myfaces-archetype-helloworld-facelets/pom.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-facelets/pom.xml
rename to myfaces-archetype-helloworld-facelets/pom.xml
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/maven2-archetypes/myfaces-archetype-helloworld-portlets/pom.xml b/myfaces-archetype-helloworld-portlets/pom.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld-portlets/pom.xml
rename to myfaces-archetype-helloworld-portlets/pom.xml
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/maven2-archetypes/myfaces-archetype-helloworld/pom.xml b/myfaces-archetype-helloworld/pom.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-helloworld/pom.xml
rename to myfaces-archetype-helloworld/pom.xml
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/maven2-archetypes/myfaces-archetype-jsfcomponents/pom.xml b/myfaces-archetype-jsfcomponents/pom.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-jsfcomponents/pom.xml
rename to myfaces-archetype-jsfcomponents/pom.xml
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/maven2-archetypes/myfaces-archetype-trinidad/pom.xml b/myfaces-archetype-trinidad/pom.xml
similarity index 100%
rename from maven2-archetypes/myfaces-archetype-trinidad/pom.xml
rename to myfaces-archetype-trinidad/pom.xml
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/maven2-archetypes/pom.xml b/pom.xml
similarity index 100%
rename from maven2-archetypes/pom.xml
rename to pom.xml
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
